tbm_surface_queue: called need_attach when queue_dequeue
[platform/core/uifw/libtbm.git] / src / tbm_surface_queue.c
index f432af3..1dadcb0 100644 (file)
@@ -567,16 +567,6 @@ _tbm_surface_queue_dequeue(tbm_surface_queue_h surface_queue)
 {
        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;
@@ -1095,7 +1085,11 @@ tbm_surface_queue_enqueue(tbm_surface_queue_h
                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)
@@ -1108,7 +1102,7 @@ tbm_surface_queue_enqueue(tbm_surface_queue_h
                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;
@@ -1142,6 +1136,18 @@ tbm_surface_queue_dequeue(tbm_surface_queue_h
 
        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
@@ -1152,7 +1158,7 @@ tbm_surface_queue_dequeue(tbm_surface_queue_h
                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;
@@ -1196,6 +1202,7 @@ tbm_surface_queue_can_dequeue(tbm_surface_queue_h surface_queue, int wait)
 
                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;
                }
@@ -1255,7 +1262,11 @@ tbm_surface_queue_release(tbm_surface_queue_h
                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) {
@@ -1282,7 +1293,7 @@ tbm_surface_queue_release(tbm_surface_queue_h
 
                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;
@@ -1326,7 +1337,7 @@ tbm_surface_queue_acquire(tbm_surface_queue_h
                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;