tbm_surface_queue: added can_dequeue callback 66/115466/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Sun, 19 Feb 2017 08:51:22 +0000 (17:51 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Mon, 20 Feb 2017 05:56:59 +0000 (14:56 +0900)
Change-Id: I86697769ba184109c8628c7a9e5dff8dcc3a018f

src/tbm_surface_queue.c
src/tbm_surface_queue.h

index be43358..0f33aab 100644 (file)
@@ -133,6 +133,7 @@ struct _tbm_surface_queue {
        struct list_head destory_noti;
        struct list_head dequeuable_noti;
        struct list_head dequeue_noti;
+       struct list_head can_dequeue_noti;
        struct list_head acquirable_noti;
        struct list_head reset_noti;
 
@@ -551,6 +552,7 @@ _tbm_surface_queue_init(tbm_surface_queue_h surface_queue,
        LIST_INITHEAD(&surface_queue->destory_noti);
        LIST_INITHEAD(&surface_queue->dequeuable_noti);
        LIST_INITHEAD(&surface_queue->dequeue_noti);
+       LIST_INITHEAD(&surface_queue->can_dequeue_noti);
        LIST_INITHEAD(&surface_queue->acquirable_noti);
        LIST_INITHEAD(&surface_queue->reset_noti);
 
@@ -699,6 +701,52 @@ tbm_surface_queue_remove_dequeue_cb(
 }
 
 tbm_surface_queue_error_e
+tbm_surface_queue_add_can_dequeue_cb(
+       tbm_surface_queue_h surface_queue, tbm_surface_queue_notify_cb can_dequeue_cb,
+       void *data)
+{
+       _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);
+
+       pthread_mutex_lock(&surface_queue->lock);
+
+       TBM_QUEUE_TRACE("tbm_surface_queue(%p)\n", surface_queue);
+
+       _notify_add(&surface_queue->can_dequeue_noti, can_dequeue_cb, data);
+
+       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_remove_can_dequeue_cb(
+       tbm_surface_queue_h surface_queue, tbm_surface_queue_notify_cb can_dequeue_cb,
+       void *data)
+{
+       _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);
+
+       pthread_mutex_lock(&surface_queue->lock);
+
+       TBM_QUEUE_TRACE("tbm_surface_queue(%p)\n", surface_queue);
+
+       _notify_remove(&surface_queue->can_dequeue_noti, can_dequeue_cb, data);
+
+       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_add_acquirable_cb(
        tbm_surface_queue_h surface_queue, tbm_surface_queue_notify_cb acquirable_cb,
        void *data)
@@ -992,6 +1040,10 @@ tbm_surface_queue_dequeue(tbm_surface_queue_h
 int
 tbm_surface_queue_can_dequeue(tbm_surface_queue_h surface_queue, int wait)
 {
+       TBM_SURF_QUEUE_RETURN_VAL_IF_FAIL(surface_queue, 0);
+
+       _notify_emit(surface_queue, &surface_queue->can_dequeue_noti);
+
        _tbm_surf_queue_mutex_lock();
 
        TBM_SURF_QUEUE_RETURN_VAL_IF_FAIL(_tbm_surface_queue_is_valid(surface_queue), 0);
@@ -1216,6 +1268,7 @@ tbm_surface_queue_destroy(tbm_surface_queue_h surface_queue)
        _notify_remove_all(&surface_queue->destory_noti);
        _notify_remove_all(&surface_queue->dequeuable_noti);
        _notify_remove_all(&surface_queue->dequeue_noti);
+       _notify_remove_all(&surface_queue->can_dequeue_noti);
        _notify_remove_all(&surface_queue->acquirable_noti);
        _notify_remove_all(&surface_queue->reset_noti);
 
index e684982..6a94225 100644 (file)
@@ -128,6 +128,14 @@ tbm_surface_queue_error_e tbm_surface_queue_remove_dequeue_cb(
        tbm_surface_queue_h surface_queue, tbm_surface_queue_notify_cb dequeue_cb,
        void *data);
 
+tbm_surface_queue_error_e tbm_surface_queue_add_can_dequeue_cb(
+       tbm_surface_queue_h surface_queue, tbm_surface_queue_notify_cb can_dequeue_cb,
+       void *data);
+
+tbm_surface_queue_error_e tbm_surface_queue_remove_can_dequeue_cb(
+       tbm_surface_queue_h surface_queue, tbm_surface_queue_notify_cb can_dequeue_cb,
+       void *data);
+
 tbm_surface_queue_error_e tbm_surface_queue_add_acquirable_cb(
        tbm_surface_queue_h surface_queue, tbm_surface_queue_notify_cb acquirable_cb,
        void *data);