tbm_surface_queue: pending delete queue_node until released queue 26/139226/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 7 Jun 2017 07:54:07 +0000 (16:54 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Tue, 18 Jul 2017 05:15:05 +0000 (05:15 +0000)
Change-Id: Id4f714e9943cba24418f990ea9fefcdad4bb86b0

src/tbm_surface_queue.c

index e0b412e..48fe3b2 100644 (file)
@@ -97,6 +97,8 @@ typedef struct {
        Queue_Node_Type type;
 
        unsigned int priv_flags;        /*for each queue*/
+
+       int delete_pending;
 } queue_node;
 
 typedef struct {
@@ -1147,6 +1149,20 @@ tbm_surface_queue_cancel_dequeue(tbm_surface_queue_h
                return TBM_SURFACE_QUEUE_ERROR_INVALID_SURFACE;
        }
 
+       if (node->delete_pending) {
+               TBM_QUEUE_TRACE("delete pending tbm_surface_queue(%p) surface(%p)\n", surface_queue, node->surface);
+
+               _queue_delete_node(surface_queue, node);
+
+               pthread_mutex_unlock(&surface_queue->lock);
+
+               _tbm_surf_queue_mutex_unlock();
+
+               _trace_emit(surface_queue, &surface_queue->trace_noti, surface, TBM_SURFACE_QUEUE_TRACE_CANCEL_DEQUEUE);
+
+               return TBM_SURFACE_QUEUE_ERROR_NONE;
+       }
+
        if (surface_queue->queue_size < surface_queue->num_attached) {
                TBM_QUEUE_TRACE("deatch tbm_surface_queue(%p) surface(%p)\n", surface_queue, node->surface);
 
@@ -1339,6 +1355,20 @@ tbm_surface_queue_release(tbm_surface_queue_h
                        return TBM_SURFACE_QUEUE_ERROR_ALREADY_EXIST;
        }
 
+       if (node->delete_pending) {
+               TBM_QUEUE_TRACE("delete pending tbm_surface_queue(%p) surface(%p)\n", surface_queue, node->surface);
+
+               _queue_delete_node(surface_queue, node);
+
+               pthread_mutex_unlock(&surface_queue->lock);
+
+               _tbm_surf_queue_mutex_unlock();
+
+               _trace_emit(surface_queue, &surface_queue->trace_noti, surface, TBM_SURFACE_QUEUE_TRACE_RELEASE);
+
+               return TBM_SURFACE_QUEUE_ERROR_NONE;
+       }
+
        if (surface_queue->queue_size < surface_queue->num_attached) {
                TBM_QUEUE_TRACE("deatch tbm_surface_queue(%p) surface(%p)\n", surface_queue, node->surface);
 
@@ -1350,6 +1380,9 @@ tbm_surface_queue_release(tbm_surface_queue_h
                pthread_mutex_unlock(&surface_queue->lock);
 
                _tbm_surf_queue_mutex_unlock();
+
+               _trace_emit(surface_queue, &surface_queue->trace_noti, surface, TBM_SURFACE_QUEUE_TRACE_RELEASE);
+
                return TBM_SURFACE_QUEUE_ERROR_NONE;
        }
 
@@ -1588,13 +1621,14 @@ tbm_surface_queue_reset(tbm_surface_queue_h
        surface_queue->format = format;
 
        /* Destory surface and Push to free_queue */
-       LIST_FOR_EACH_ENTRY_SAFE(node, tmp, &surface_queue->list, link)
+       LIST_FOR_EACH_ENTRY_SAFE(node, tmp, &surface_queue->free_queue.head, link)
                _queue_delete_node(surface_queue, node);
 
+       LIST_FOR_EACH_ENTRY(node, &surface_queue->list, link)
+               node->delete_pending = 1;
+
        /* Reset queue */
        _queue_init(&surface_queue->free_queue);
-       _queue_init(&surface_queue->dirty_queue);
-       LIST_INITHEAD(&surface_queue->list);
 
        surface_queue->num_attached = 0;
 
@@ -1650,13 +1684,14 @@ tbm_surface_queue_set_size(tbm_surface_queue_h
 
        if (flush) {
                /* Destory surface and Push to free_queue */
-               LIST_FOR_EACH_ENTRY_SAFE(node, tmp, &surface_queue->list, link)
+               LIST_FOR_EACH_ENTRY_SAFE(node, tmp, &surface_queue->free_queue.head, item_link)
                        _queue_delete_node(surface_queue, node);
 
+               LIST_FOR_EACH_ENTRY(node, &surface_queue->list, link)
+                       node->delete_pending = 1;
+
                /* Reset queue */
                _queue_init(&surface_queue->free_queue);
-               _queue_init(&surface_queue->dirty_queue);
-               LIST_INITHEAD(&surface_queue->list);
 
                surface_queue->num_attached = 0;
                surface_queue->queue_size = queue_size;
@@ -1756,13 +1791,14 @@ tbm_surface_queue_flush(tbm_surface_queue_h surface_queue)
        pthread_mutex_lock(&surface_queue->lock);
 
        /* Destory surface and Push to free_queue */
-       LIST_FOR_EACH_ENTRY_SAFE(node, tmp, &surface_queue->list, link)
+       LIST_FOR_EACH_ENTRY_SAFE(node, tmp, &surface_queue->free_queue.head, item_link)
                _queue_delete_node(surface_queue, node);
 
+       LIST_FOR_EACH_ENTRY(node, &surface_queue->list, link)
+               node->delete_pending = 1;
+
        /* Reset queue */
        _queue_init(&surface_queue->free_queue);
-       _queue_init(&surface_queue->dirty_queue);
-       LIST_INITHEAD(&surface_queue->list);
 
        surface_queue->num_attached = 0;
 
@@ -1958,14 +1994,6 @@ __tbm_queue_sequence_init(tbm_surface_queue_h surface_queue)
 }
 
 static void
-__tbm_queue_sequence_reset(tbm_surface_queue_h surface_queue)
-{
-       tbm_queue_sequence *data = (tbm_queue_sequence *)surface_queue->impl_data;
-
-       _queue_init(&data->dequeue_list);
-}
-
-static void
 __tbm_queue_sequence_destroy(tbm_surface_queue_h surface_queue)
 {
        free(surface_queue->impl_data);
@@ -2053,7 +2081,7 @@ __tbm_queue_sequence_dequeue(tbm_surface_queue_h
 
 static const tbm_surface_queue_interface tbm_queue_sequence_impl = {
        __tbm_queue_sequence_init,
-       __tbm_queue_sequence_reset,
+       NULL,
        __tbm_queue_sequence_destroy,
        __tbm_queue_sequence_need_attach,
        __tbm_queue_sequence_enqueue,