{
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);
{
queue_node *node;
- if (_queue_is_empty(&surface_queue->free_queue)) {
- if (surface_queue->impl && surface_queue->impl->need_attach)
- surface_queue->impl->need_attach(surface_queue);
-
- if (_queue_is_empty(&surface_queue->free_queue)) {
- TBM_LOG_E("surface_queue->free_queue is empty.\n");
- return NULL;
- }
- }
-
node = _queue_node_pop_front(&surface_queue->free_queue);
return node;
pthread_mutex_unlock(&surface_queue->lock);
_tbm_surf_queue_mutex_unlock();
- return TBM_SURFACE_QUEUE_ERROR_ALREADY_EXIST;
+
+ if (!node)
+ return TBM_SURFACE_QUEUE_ERROR_UNKNOWN_SURFACE;
+ else
+ return TBM_SURFACE_QUEUE_ERROR_ALREADY_EXIST;
}
if (surface_queue->impl && surface_queue->impl->enqueue)
pthread_mutex_unlock(&surface_queue->lock);
_tbm_surf_queue_mutex_unlock();
- return TBM_SURFACE_QUEUE_ERROR_UNKNOWN_SURFACE;
+ return TBM_SURFACE_QUEUE_ERROR_EMPTY;
}
node->type = QUEUE_NODE_TYPE_ENQUEUE;
pthread_mutex_lock(&surface_queue->lock);
+ if (_queue_is_empty(&surface_queue->free_queue)) {
+ if (surface_queue->impl && surface_queue->impl->need_attach)
+ surface_queue->impl->need_attach(surface_queue);
+
+ if (!_tbm_surface_queue_is_valid(surface_queue)) {
+ TBM_LOG_E("surface_queue:%p is invalid", surface_queue);
+ pthread_mutex_unlock(&surface_queue->lock);
+ _tbm_surf_queue_mutex_unlock();
+ return TBM_SURFACE_QUEUE_ERROR_INVALID_QUEUE;
+ }
+ }
+
if (surface_queue->impl && surface_queue->impl->dequeue)
node = surface_queue->impl->dequeue(surface_queue);
else
pthread_mutex_unlock(&surface_queue->lock);
_tbm_surf_queue_mutex_unlock();
- return TBM_SURFACE_QUEUE_ERROR_INVALID_QUEUE;
+ return TBM_SURFACE_QUEUE_ERROR_EMPTY;
}
node->type = QUEUE_NODE_TYPE_DEQUEUE;
if (!_tbm_surface_queue_is_valid(surface_queue)) {
TBM_LOG_E("surface_queue:%p is invalid", surface_queue);
+ pthread_mutex_unlock(&surface_queue->lock);
_tbm_surf_queue_mutex_unlock();
return 0;
}
pthread_mutex_unlock(&surface_queue->lock);
_tbm_surf_queue_mutex_unlock();
- return TBM_SURFACE_QUEUE_ERROR_INVALID_SURFACE;
+
+ if (!node)
+ return TBM_SURFACE_QUEUE_ERROR_UNKNOWN_SURFACE;
+ else
+ return TBM_SURFACE_QUEUE_ERROR_ALREADY_EXIST;
}
if (surface_queue->queue_size < surface_queue->num_attached) {
TBM_LOG_E("surface_queue->free_queue is empty.\n");
_tbm_surf_queue_mutex_unlock();
- return TBM_SURFACE_QUEUE_ERROR_INVALID_SURFACE;
+ return TBM_SURFACE_QUEUE_ERROR_EMPTY;
}
node->type = QUEUE_NODE_TYPE_RELEASE;
pthread_mutex_unlock(&surface_queue->lock);
_tbm_surf_queue_mutex_unlock();
- return TBM_SURFACE_QUEUE_ERROR_INVALID_QUEUE;
+ return TBM_SURFACE_QUEUE_ERROR_EMPTY;
}
node->type = QUEUE_NODE_TYPE_ACQUIRE;
}
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;