wl_egl: Add defense code for fake signal in buffer_clear 02/283502/1
authorJoonbum Ko <joonbum.ko@samsung.com>
Thu, 27 Oct 2022 15:02:58 +0000 (00:02 +0900)
committerJoonbum Ko <joonbum.ko@samsung.com>
Fri, 28 Oct 2022 00:12:12 +0000 (09:12 +0900)
 tpl_gcond_timed_wait is changed to be called within the while loop.
 It will repeat the process of checking status even if it wakes up
 due to Fake Signal.

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

index fb9286f..67c14a1 100755 (executable)
@@ -2116,19 +2116,17 @@ _tpl_wl_egl_surface_buffer_clear(tpl_wl_egl_surface_t *wl_egl_surface)
                                  status_to_string[status]);
 
                if (status >= ENQUEUED) {
-                       tpl_bool_t need_to_wait  = TPL_FALSE;
                        tpl_result_t wait_result = TPL_ERROR_NONE;
 
-                       need_to_wait = (status < COMMITTED);
-
-                       if (need_to_wait) {
+                       while (status < COMMITTED && wait_result != TPL_ERROR_TIME_OUT) {
+                               tpl_gmutex_unlock(&wl_egl_buffer->mutex);
                                /* The lock/unlock order of buffer->mutex and display->wl_event_mutex
                                 * is important. display->mutex must surround buffer->mutex */
-                               tpl_gmutex_unlock(&wl_egl_buffer->mutex);
                                wait_result = tpl_gcond_timed_wait(&wl_egl_buffer->cond,
                                                                                                   &wl_egl_display->wl_event_mutex,
                                                                                                   200); /* 200ms */
                                tpl_gmutex_lock(&wl_egl_buffer->mutex);
+                               status = wl_egl_buffer->status; /* update status */
 
                                if (wait_result == TPL_ERROR_TIME_OUT)
                                        TPL_WARN("timeout occured waiting signaled. wl_egl_buffer(%p)",
@@ -2136,8 +2134,6 @@ _tpl_wl_egl_surface_buffer_clear(tpl_wl_egl_surface_t *wl_egl_surface)
                        }
                }
 
-               status = wl_egl_buffer->status; /* update status */
-
                /* ACQUIRED, WAITING_SIGNALED, WAITING_VBLANK, COMMITTED */
                /* It has been acquired but has not yet been released, so this
                 * buffer must be released. */