tpl_wayland_egl_thread: Enhanced thread safety for get_swapchain_buffers 38/188938/1
authorJoonbum Ko <joonbum.ko@samsung.com>
Wed, 12 Sep 2018 00:12:54 +0000 (09:12 +0900)
committerJoonbum Ko <joonbum.ko@samsung.com>
Wed, 12 Sep 2018 01:16:16 +0000 (10:16 +0900)
 - If wayland events handled in the event thread during get_swapchain_buffers,
  unexpected problem can occur.

Change-Id: I6c6955fd7bb5f9b03372de0c396c1b6e157b92c0
Signed-off-by: Joonbum Ko <joonbum.ko@samsung.com>
src/tpl_wl_vk_thread.c

index 17ffa5c..2242975 100644 (file)
@@ -522,12 +522,14 @@ __tpl_wl_vk_wsi_surface_get_swapchain_buffers(tpl_surface_t *surface,
 {
        tbm_surface_h *swapchain_buffers = NULL;
        tpl_wayland_vk_wsi_surface_t *wayland_vk_wsi_surface = NULL;
+       tpl_wayland_vk_wsi_display_t *wayland_vk_wsi_display = NULL;
        int i;
        tpl_result_t ret = TPL_ERROR_NONE;
 
        TPL_ASSERT(surface);
        TPL_ASSERT(surface->backend.data);
        TPL_ASSERT(surface->display);
+       TPL_ASSERT(surface->display->backend.data);
        TPL_ASSERT(buffers);
        TPL_ASSERT(buffer_count);
 
@@ -539,23 +541,29 @@ __tpl_wl_vk_wsi_surface_get_swapchain_buffers(tpl_surface_t *surface,
                return TPL_ERROR_OUT_OF_MEMORY;
        }
 
-       ret = twe_surface_get_swapchain_buffers(wayland_vk_wsi_surface->twe_surface,
-                                                                                       swapchain_buffers, buffer_count);
-       if (ret != TPL_ERROR_NONE) {
-               TPL_ERR("Failed to get swapchain_buffers. wayland_vk_wsi_surface(%p) twe_surface(%p)",
-                               wayland_vk_wsi_surface, wayland_vk_wsi_surface->twe_surface);
-               free(swapchain_buffers);
-               swapchain_buffers = NULL;
-               return ret;
-       }
+       wayland_vk_wsi_display = (tpl_wayland_vk_wsi_display_t *)surface->display->backend.data;
 
-       for (i = 0; i < *buffer_count; i++) {
-               TPL_DEBUG("swapchain_buffers[%d] = tbm_surface(%p) bo(%d)",
-                                 i, swapchain_buffers[i],
-                                 tbm_bo_export(tbm_surface_internal_get_bo(swapchain_buffers[i], 0)));
-       }
+       if (twe_display_lock(wayland_vk_wsi_display->twe_display) == TPL_ERROR_NONE) {
+               ret = twe_surface_get_swapchain_buffers(wayland_vk_wsi_surface->twe_surface,
+                                                                                               swapchain_buffers, buffer_count);
+               if (ret != TPL_ERROR_NONE) {
+                       TPL_ERR("Failed to get swapchain_buffers. wayland_vk_wsi_surface(%p) twe_surface(%p)",
+                                       wayland_vk_wsi_surface, wayland_vk_wsi_surface->twe_surface);
+                       free(swapchain_buffers);
+                       swapchain_buffers = NULL;
+                       return ret;
+               }
 
-       *buffers = swapchain_buffers;
+               for (i = 0; i < *buffer_count; i++) {
+                       TPL_DEBUG("swapchain_buffers[%d] = tbm_surface(%p) bo(%d)",
+                                         i, swapchain_buffers[i],
+                                         tbm_bo_export(tbm_surface_internal_get_bo(swapchain_buffers[i], 0)));
+               }
+
+               *buffers = swapchain_buffers;
+
+               twe_display_unlock(wayland_vk_wsi_display->twe_display);
+       }
 
        return TPL_ERROR_NONE;
 }