tbm_surface_queue: Add tbm_surface_queue_get_next_dequeue 62/316662/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Mon, 26 Aug 2024 10:11:53 +0000 (19:11 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Mon, 26 Aug 2024 10:32:27 +0000 (19:32 +0900)
Change-Id: I39c5d2c02ef12f566db2e55f99d98cb1cbd7ed47

include/tbm_surface_queue_internal.h
src/tbm_surface_queue.c

index 816ccc6aba929b45414e2dce5676e022286686d6..0e30dcf2ba71556b6ecc380b35c2d66ae1a1130a 100644 (file)
@@ -223,6 +223,18 @@ 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);
 
+/**
+ * @brief Get Next Dequeue the tbm_surface from the tbm_surface_queue.
+ *
+ * @param[in]  surface_queue  The #tbm_surface_queue_h
+ * @param[out] surface        The #tbm_surface_h
+ *
+ * @return  #TBM_SURFACE_ERROR_NONE on success,
+ *          otherwise an error status value
+ */
+tbm_surface_queue_error_e tbm_surface_queue_get_next_dequeue(
+               tbm_surface_queue_h surface_queue, tbm_surface_h *surface);
+
 #ifdef __cplusplus
 }
 #endif
index 4c7f26e9b556e9b323db7805de258db8245338ed..914f86952555d7bc6d4d2f72b7b435c01f1b843b 100644 (file)
@@ -250,6 +250,19 @@ _queue_node_pop_front(queue *queue)
        return node;
 }
 
+static queue_node *
+_queue_node_get_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);
+
+       return node;
+}
+
 static queue_node *
 _queue_node_pop(queue *queue, queue_node *node)
 {
@@ -2401,3 +2414,39 @@ tbm_surface_queue_set_sync_count(tbm_surface_queue_h surface_queue,
 
        return TBM_SURFACE_QUEUE_ERROR_NONE;
 }
+
+tbm_surface_queue_error_e
+tbm_surface_queue_get_next_dequeue(tbm_surface_queue_h surface_queue, tbm_surface_h *surface)
+{
+       queue_node *node;
+
+       _tbm_surf_queue_mutex_lock();
+       _tbm_set_last_result(TBM_ERROR_NONE);
+
+       TBM_SURF_QUEUE_RETURN_VAL_IF_FAIL(_tbm_surface_queue_is_valid(surface_queue),
+                              TBM_SURFACE_QUEUE_ERROR_INVALID_QUEUE);
+       TBM_SURF_QUEUE_RETURN_VAL_IF_FAIL(surface != NULL,
+                              TBM_SURFACE_QUEUE_ERROR_INVALID_SURFACE);
+
+       *surface = NULL;
+
+       pthread_mutex_lock(&surface_queue->lock);
+
+       node = _queue_node_get_front(&surface_queue->free_queue);
+       if (!node) {
+               _tbm_set_last_result(TBM_SURFACE_QUEUE_ERROR_EMPTY);
+               pthread_mutex_unlock(&surface_queue->lock);
+               _tbm_surf_queue_mutex_unlock();
+               return TBM_SURFACE_QUEUE_ERROR_EMPTY;
+       }
+
+       *surface = node->surface;
+
+       TBM_TRACE_SURFACE_QUEUE("tbm_surface_queue(%p) tbm_surface(%p)", surface_queue, *surface);
+
+       pthread_mutex_unlock(&surface_queue->lock);
+
+       _tbm_surf_queue_mutex_unlock();
+
+       return TBM_SURFACE_QUEUE_ERROR_NONE;
+}