From: Changyeon Lee Date: Mon, 26 Aug 2024 10:11:53 +0000 (+0900) Subject: tbm_surface_queue: Add tbm_surface_queue_get_next_dequeue X-Git-Tag: accepted/tizen/unified/20240827.042038~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e9cb30f2851817a6f4ea33431e7268e5f2f18957;p=platform%2Fcore%2Fuifw%2Flibtbm.git tbm_surface_queue: Add tbm_surface_queue_get_next_dequeue Change-Id: I39c5d2c02ef12f566db2e55f99d98cb1cbd7ed47 --- diff --git a/include/tbm_surface_queue_internal.h b/include/tbm_surface_queue_internal.h index 816ccc6..0e30dcf 100644 --- a/include/tbm_surface_queue_internal.h +++ b/include/tbm_surface_queue_internal.h @@ -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 diff --git a/src/tbm_surface_queue.c b/src/tbm_surface_queue.c index 4c7f26e..914f869 100644 --- a/src/tbm_surface_queue.c +++ b/src/tbm_surface_queue.c @@ -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; +}