client: destroy wl_buffer if it isn't returned in client_create_buffer 75/211375/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Thu, 1 Aug 2019 11:38:39 +0000 (20:38 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Thu, 1 Aug 2019 11:43:13 +0000 (20:43 +0900)
Change-Id: Ib7df6d2c8cf03b36221ab50067843854a6942be5

src/wayland-tbm-client.c

index 0c5c04db26ad432a4a9e6edf180f8ec7157e2e91..b1663352c02b11cb7b702128bd7e36731f1028a8 100644 (file)
@@ -62,7 +62,7 @@ struct wayland_tbm_buffer {
        tbm_surface_h tbm_surface;
        uint32_t flags;
        int allocated;
-       int reuse;
+       int exposed;
        int usable;
        int expire;
 
@@ -483,8 +483,11 @@ wayland_tbm_client_create_buffer(struct wayland_tbm_client *tbm_client,
         */
 
        buffer = _wayland_tbm_client_find_tbm_buffer_surface(tbm_client, surface);
-       if (buffer)
+       if (buffer) {
+               WL_TBM_TRACE("wl_buffer:%p tbm_surface:%p", buffer->wl_buffer, buffer->tbm_surface);
+               buffer->exposed = 1;
                return buffer->wl_buffer;
+       }
 
        if (tbm_surface_get_info(surface, &info) != TBM_SURFACE_ERROR_NONE) {
                WL_TBM_LOG_E("Failed to create buffer from surface");
@@ -656,6 +659,28 @@ wayland_tbm_client_get_bufmgr(struct wayland_tbm_client *tbm_client)
        return (void *)tbm_client->bufmgr;
 }
 
+static void
+_wayland_tbm_client_destroy_tbm_buffer(struct wayland_tbm_surface_queue *queue_info,
+                       struct wayland_tbm_buffer *buffer)
+{
+       WL_TBM_TRACE("wl_buffer:%p tbm_surface:%p surface_queue:%p",
+               buffer->wl_buffer, buffer->tbm_surface, queue_info->tbm_queue);
+
+       if (buffer->wl_buffer) {
+               WL_TBM_TRACE("wl_buffer:%p detach", buffer->wl_buffer);
+               wl_tbm_queue_detach_buffer(queue_info->wl_tbm_queue, buffer->wl_buffer);
+
+               if (!buffer->exposed) {
+                       WL_TBM_TRACE("wl_buffer:%p destroy", buffer->wl_buffer);
+                       wl_buffer_destroy(buffer->wl_buffer);
+                       buffer->wl_buffer = NULL;
+               }
+       }
+
+       wl_list_remove(&buffer->link);
+       free(buffer);
+}
+
 static void
 _wayland_tbm_client_queue_get_attach_bufs(struct wayland_tbm_surface_queue *queue_info,
                                                                int unused, tbm_surface_h *surfaces, int *count)
@@ -677,23 +702,8 @@ _wayland_tbm_client_queue_destroy_attach_bufs(struct wayland_tbm_surface_queue *
 {
        struct wayland_tbm_buffer *buffer, *tmp;
 
-       wl_list_for_each_safe(buffer, tmp, &queue_info->attach_bufs, link) {
-               WL_TBM_TRACE("wl_buffer:%p tbm_surface:%p surface_queue:%p",
-                       buffer->wl_buffer, buffer->tbm_surface, queue_info->tbm_queue);
-
-               if (buffer->wl_buffer) {
-                       wl_tbm_queue_detach_buffer(queue_info->wl_tbm_queue, buffer->wl_buffer);
-
-                       if (!buffer->reuse) {
-                               WL_TBM_TRACE("wl_buffer:%p destroy", buffer->wl_buffer);
-                               wl_buffer_destroy(buffer->wl_buffer);
-                               buffer->wl_buffer = NULL;
-                       }
-               }
-
-               wl_list_remove(&buffer->link);
-               free(buffer);
-       }
+       wl_list_for_each_safe(buffer, tmp, &queue_info->attach_bufs, link)
+               _wayland_tbm_client_destroy_tbm_buffer(queue_info, buffer);
 }
 
 static void
@@ -710,21 +720,7 @@ _wayland_tbm_client_queue_destroy_unused_attach_bufs(struct wayland_tbm_surface_
                        continue;
                }
 
-               WL_TBM_TRACE("wl_buffer:%p tbm_surface:%p surface_queue:%p",
-                       buffer->wl_buffer, buffer->tbm_surface, queue_info->tbm_queue);
-
-               if (buffer->wl_buffer) {
-                       wl_tbm_queue_detach_buffer(queue_info->wl_tbm_queue, buffer->wl_buffer);
-
-                       if (!buffer->reuse) {
-                               WL_TBM_TRACE("wl_buffer:%p destroy", buffer->wl_buffer);
-                               wl_buffer_destroy(buffer->wl_buffer);
-                               buffer->wl_buffer = NULL;
-                       }
-               }
-
-               wl_list_remove(&buffer->link);
-               free(buffer);
+               _wayland_tbm_client_destroy_tbm_buffer(queue_info, buffer);
        }
 }
 
@@ -938,15 +934,11 @@ __wayland_tbm_client_surface_free_cb(tbm_surface_queue_h surface_queue, void *da
                if (!buffer->allocated) continue;
 
                buffer->allocated = 0;
-               buffer->reuse = 1;
 
                if (queue_info->is_active && !buffer->expire) continue;
-               if (buffer->wl_buffer)
-                       wl_tbm_queue_detach_buffer(queue_info->wl_tbm_queue, buffer->wl_buffer);
 
+               _wayland_tbm_client_destroy_tbm_buffer(queue_info, buffer);
                attached = 1;
-               wl_list_remove(&buffer->link);
-               free(buffer);
        }
 
        pthread_mutex_unlock(&queue_info->lock);