}
}
+static int
+_tbm_surface_queue_get_node_count(tbm_surface_queue_h surface_queue, Queue_Node_Type type)
+{
+ queue_node *node = NULL;
+ queue_node *tmp = NULL;
+ int count = 0;
+
+ LIST_FOR_EACH_ENTRY_SAFE(node, tmp, &surface_queue->list, link) {
+ if (node->type == type)
+ count++;
+ }
+
+ return count;
+}
+
void
_tbm_surface_queue_attach(tbm_surface_queue_h surface_queue,
tbm_surface_h surface)
TBM_RETURN_VAL_IF_FAIL(surface != NULL,
TBM_SURFACE_QUEUE_ERROR_INVALID_SURFACE);
+ if (b_dump_queue)
+ tbm_surface_internal_dump_buffer(surface, "enqueue");
+
pthread_mutex_lock(&surface_queue->lock);
TBM_QUEUE_TRACE("tbm_surface_queue(%p) tbm_surface(%p)\n", surface_queue, surface);
}
if (_queue_is_empty(&surface_queue->free_queue)) {
- if (wait) {
+ if (wait &&
+ _tbm_surface_queue_get_node_count(surface_queue,QUEUE_NODE_TYPE_ACQUIRE)) {
+
pthread_cond_wait(&surface_queue->free_cond, &surface_queue->lock);
pthread_mutex_unlock(&surface_queue->lock);
return 1;
pthread_mutex_unlock(&surface_queue->lock);
+ if (b_dump_queue)
+ tbm_surface_internal_dump_buffer(*surface, "acquire");
+
return TBM_SURFACE_QUEUE_ERROR_NONE;
}
TBM_QUEUE_TRACE("tbm_surface_queue(%p)\n", surface_queue);
if (_queue_is_empty(&surface_queue->dirty_queue)) {
- if (wait) {
+ if (wait &&
+ _tbm_surface_queue_get_node_count(surface_queue,QUEUE_NODE_TYPE_DEQUEUE)) {
+
if (!_queue_has_node_type(surface_queue, QUEUE_NODE_TYPE_DEQUEUE)) {
TBM_LOG_E("Deosn't have dequeue type node\n");
pthread_mutex_unlock(&surface_queue->lock);