tbm_surface_queue: add tbm_surface_queue_free_flush 38/132538/3
authorSangjin Lee <lsj119@samsung.com>
Tue, 6 Jun 2017 22:49:17 +0000 (07:49 +0900)
committerSangjin Lee <lsj119@samsung.com>
Fri, 9 Jun 2017 03:22:24 +0000 (03:22 +0000)
Add function to flush just free buffer.
and fix simple bug in queue_list.
This function use in tizen_surface_shm_flusher::free_flush protocol.

Change-Id: Id1f4f305217901beb0271e439deb981c215ef018

src/tbm_surface_queue.c
src/tbm_surface_queue.h

index 55dbf10..f432af3 100644 (file)
@@ -292,6 +292,9 @@ _queue_node_pop_front(queue *queue)
 {
        queue_node *node;
 
+       if (!queue->head.next) return NULL;
+       if (!queue->count) return NULL;
+
        node = LIST_ENTRY(queue_node, queue->head.next, item_link);
 
        LIST_DELINIT(&node->item_link);
@@ -1562,6 +1565,42 @@ tbm_surface_queue_set_size(tbm_surface_queue_h
 }
 
 tbm_surface_queue_error_e
+tbm_surface_queue_free_flush(tbm_surface_queue_h surface_queue)
+{
+       queue_node *node = NULL;
+
+       _tbm_surf_queue_mutex_lock();
+
+       TBM_SURF_QUEUE_RETURN_VAL_IF_FAIL(_tbm_surface_queue_is_valid(surface_queue),
+                              TBM_SURFACE_QUEUE_ERROR_INVALID_QUEUE);
+
+       TBM_QUEUE_TRACE("tbm_surface_queue(%p)\n", surface_queue);
+
+       if (surface_queue->num_attached == 0) {
+               _tbm_surf_queue_mutex_unlock();
+               return TBM_SURFACE_QUEUE_ERROR_NONE;
+       }
+
+       pthread_mutex_lock(&surface_queue->lock);
+
+       /* Destory surface in free_queue */
+       while ((node = _queue_node_pop_front(&surface_queue->free_queue))) {
+               if (surface_queue->impl && surface_queue->impl->need_detach)
+                       surface_queue->impl->need_detach(surface_queue, node);
+               else
+                       _tbm_surface_queue_detach(surface_queue, node->surface);
+       }
+
+       /* Reset queue */
+       _queue_init(&surface_queue->free_queue);
+
+       pthread_mutex_unlock(&surface_queue->lock);
+       _tbm_surf_queue_mutex_unlock();
+
+       return TBM_SURFACE_QUEUE_ERROR_NONE;
+}
+
+tbm_surface_queue_error_e
 tbm_surface_queue_flush(tbm_surface_queue_h surface_queue)
 {
        queue_node *node = NULL, *tmp;
index cf0c413..216bde6 100644 (file)
@@ -104,6 +104,7 @@ tbm_surface_queue_error_e tbm_surface_queue_set_size(
                tbm_surface_queue_h surface_queue, int queue_size, int flush);
 
 tbm_surface_queue_error_e tbm_surface_queue_flush(tbm_surface_queue_h surface_queue);
+tbm_surface_queue_error_e tbm_surface_queue_free_flush(tbm_surface_queue_h surface_queue);
 
 tbm_surface_queue_error_e tbm_surface_queue_notify_reset(tbm_surface_queue_h surface_queue);