client: add checking active_flush valid after lock of queue_info 78/211378/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Fri, 2 Aug 2019 04:51:00 +0000 (13:51 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Fri, 2 Aug 2019 05:27:35 +0000 (14:27 +0900)
it is possible that deactive or size is changed when unlock of queue_info

Change-Id: If91c0b0d8bf9feb547e61a7cd248863f4c0814da

src/wayland-tbm-client.c

index 816ad86..bd419f5 100644 (file)
@@ -1285,9 +1285,11 @@ _handle_tbm_surface_queue_reset_notify(tbm_surface_queue_h surface_queue,
 static int
 _wayland_tbm_client_is_active_flush_valid(struct wayland_tbm_surface_queue *queue_info)
 {
-       if (queue_info->width != queue_info->active_flush_width ||
-               queue_info->height != queue_info->active_flush_height)
-               return 0;
+
+       if (!queue_info->is_active) return 0;
+       if (!queue_info->active_flush) return 0;
+       if (queue_info->width != queue_info->active_flush_width) return 0;
+       if (queue_info->height != queue_info->active_flush_height) return 0;
 
        return 1;
 }
@@ -1303,10 +1305,6 @@ _handle_tbm_surface_queue_can_dequeue_notify(tbm_surface_queue_h surface_queue,
        WL_TBM_RETURN_IF_FAIL(queue_info != NULL);
 
        pthread_mutex_lock(&queue_info->lock);
-       if (!queue_info->is_active || !queue_info->active_flush) {
-               pthread_mutex_unlock(&queue_info->lock);
-               return;
-       }
 
        if (!_wayland_tbm_client_is_active_flush_valid(queue_info)) {
                pthread_mutex_unlock(&queue_info->lock);
@@ -1318,8 +1316,14 @@ _handle_tbm_surface_queue_can_dequeue_notify(tbm_surface_queue_h surface_queue,
                pthread_mutex_unlock(&queue_info->lock);
                tbm_surface_queue_set_size(surface_queue, queue_size, 1);
                pthread_mutex_lock(&queue_info->lock);
-               queue_info->active_flush_done = 1;
-               WL_TBM_LOG("surface_queue:%p active_flush_done", surface_queue);
+               if (_wayland_tbm_client_is_active_flush_valid(queue_info)) {
+                       queue_info->active_flush_done = 1;
+                       WL_TBM_LOG("surface_queue:%p active_flush_done", surface_queue);
+               } else {
+                       WL_TBM_LOG("surface_queue:%p active:%d (%dx%d) changed",
+                                               surface_queue, queue_info->is_active,
+                                               queue_info->width, queue_info->height);
+               }
        }
 
        pthread_mutex_unlock(&queue_info->lock);