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
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)
{
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;
+}