Added surface_vblanks list for safe destroy. 48/258548/1
authorJoonbum Ko <joonbum.ko@samsung.com>
Mon, 17 May 2021 07:23:49 +0000 (16:23 +0900)
committerJoonbum Ko <joonbum.ko@samsung.com>
Thu, 20 May 2021 05:36:57 +0000 (14:36 +0900)
 - If an error occurs in tdm_client_display,
  it is a problem that cannot be recovered,
  but it should not affect rendering.
 - In this case, destroy tdm_client and stop using wait_vblank.
 - However, a problem occurs when accessing vblank after tdm_client_destroy.
 - Therefore, the created vblanks must be destroyed first and then
  destroy the tdm_client.
 - The added surface_vblanks list is to trace the created vblanks.

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

index 7463197..deba3b6 100755 (executable)
@@ -60,6 +60,7 @@ struct _tpl_wl_egl_display {
                tpl_gsource              *tdm_source;
                int                       tdm_display_fd;
                tpl_bool_t                tdm_initialized;
+               tpl_list_t               *surface_vblanks;
        } tdm;
 
        struct tizen_surface_shm     *tss; /* used for surface buffer_flush */
@@ -238,6 +239,8 @@ _thread_surface_queue_acquire(tpl_wl_egl_surface_t *wl_egl_surface);
 static void
 _thread_wl_surface_commit(tpl_wl_egl_surface_t *wl_egl_surface,
                                                  tpl_wl_egl_buffer_t *wl_egl_buffer);
+static void
+__cb_surface_vblank_free(void *data);
 
 static tpl_bool_t
 _check_native_handle_is_wl_display(tpl_handle_t display)
@@ -311,12 +314,20 @@ __thread_func_tdm_finalize(tpl_gsource *gsource)
                          wl_egl_display, wl_egl_display->tdm.tdm_client, gsource);
 
        if (wl_egl_display->tdm.tdm_client) {
+
+               if (wl_egl_display->tdm.surface_vblanks) {
+                       __tpl_list_free(wl_egl_display->tdm.surface_vblanks,
+                                   __cb_surface_vblank_free);
+                       wl_egl_display->tdm.surface_vblanks = NULL;
+               }
+
                tdm_client_destroy(wl_egl_display->tdm.tdm_client);
                wl_egl_display->tdm.tdm_client = NULL;
                wl_egl_display->tdm.tdm_display_fd = -1;
                wl_egl_display->tdm.tdm_source = NULL;
        }
 
+       wl_egl_display->use_wait_vblank = TPL_FALSE;
        wl_egl_display->tdm.tdm_initialized = TPL_FALSE;
 }
 
@@ -351,6 +362,7 @@ _thread_tdm_init(tpl_wl_egl_display_t *wl_egl_display)
        wl_egl_display->tdm.tdm_client      = tdm_client;
        wl_egl_display->tdm.tdm_source      = NULL;
        wl_egl_display->tdm.tdm_initialized = TPL_TRUE;
+       wl_egl_display->tdm.surface_vblanks = __tpl_list_alloc();
 
        TPL_INFO("[TDM_CLIENT_INIT]",
                         "wl_egl_display(%p) tdm_client(%p) tdm_display_fd(%d)",
@@ -1475,17 +1487,10 @@ _thread_wl_egl_surface_fini(tpl_wl_egl_surface_t *wl_egl_surface)
        }
 
        if (wl_egl_surface->vblank) {
-               tpl_surface_vblank_t *vblank = wl_egl_surface->vblank;
-               TPL_INFO("[VBLANK_DESTROY]",
-                                "wl_egl_surface(%p) surface_vblank(%p) tdm_vblank(%p)",
-                                wl_egl_surface, vblank,
-                                vblank->tdm_vblank);
-               tdm_client_vblank_destroy(vblank->tdm_vblank);
-               vblank->tdm_vblank = NULL;
-               vblank->wl_egl_surface = NULL;
-               free(vblank);
-
-               wl_egl_surface->vblank = NULL;
+               __tpl_list_remove_data(wl_egl_display->tdm.surface_vblanks,
+                                                          (void *)wl_egl_surface->vblank,
+                                                          TPL_FIRST,
+                                                          __cb_surface_vblank_free);
        }
 
        if (wl_egl_surface->tbm_queue) {
@@ -1792,6 +1797,28 @@ _thread_create_tdm_client_vblank(tdm_client *tdm_client)
 }
 
 static void
+__cb_surface_vblank_free(void *data)
+{
+       TPL_CHECK_ON_NULL_RETURN(data);
+
+       tpl_surface_vblank_t *vblank = (tpl_surface_vblank_t *)data;
+       tpl_wl_egl_surface_t *wl_egl_surface = vblank->wl_egl_surface;
+
+       TPL_INFO("[VBLANK_DESTROY]",
+                        "wl_egl_surface(%p) surface_vblank(%p) tdm_vblank(%p)",
+                        wl_egl_surface, vblank,
+                        vblank->tdm_vblank);
+
+       tdm_client_vblank_destroy(vblank->tdm_vblank);
+       vblank->tdm_vblank = NULL;
+       vblank->wl_egl_surface = NULL;
+
+       free(vblank);
+
+       wl_egl_surface->vblank = NULL;
+}
+
+static void
 _thread_wl_egl_surface_init(tpl_wl_egl_surface_t *wl_egl_surface)
 {
        tpl_wl_egl_display_t *wl_egl_display = wl_egl_surface->wl_egl_display;
@@ -1833,6 +1860,9 @@ _thread_wl_egl_surface_init(tpl_wl_egl_surface_t *wl_egl_surface)
                                vblank->waiting_buffers = __tpl_list_alloc();
                                vblank->wl_egl_surface = wl_egl_surface;
 
+                               __tpl_list_push_back(wl_egl_display->tdm.surface_vblanks,
+                                                                        (void *)vblank);
+
                                TPL_INFO("[VBLANK_INIT]",
                                                 "wl_egl_surface(%p) tdm_client(%p) tdm_vblank(%p)",
                                                 wl_egl_surface, wl_egl_display->tdm.tdm_client,