Initialize last_deq_buffer to NULL when it free. 07/268507/1
authorJoonbum Ko <joonbum.ko@samsung.com>
Fri, 24 Dec 2021 01:40:41 +0000 (10:40 +0900)
committerJoonbum Ko <joonbum.ko@samsung.com>
Fri, 24 Dec 2021 01:46:35 +0000 (10:46 +0900)
 Problem : DEQ -> ENQ -> ACQ -> VBLANK -> COMMIT -> RELEASE
  -> QUEUE_RESET -> last_deq_buffer free
  -> try DEQ !!< will be blocked.

 Init wl_egl_surface->last_deq_buffer to NULL when it was free
  to prevent to access the wrong pointer of last_deq_buffer.

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

index 62fba27..59c0d4c 100755 (executable)
@@ -2436,7 +2436,7 @@ __tpl_wl_egl_surface_dequeue_buffer(tpl_surface_t *surface, uint64_t timeout_ns,
                tpl_wl_egl_buffer_t *last_deq_buffer = wl_egl_surface->last_deq_buffer;
 
                tpl_gmutex_lock(&last_deq_buffer->mutex);
-               if (last_deq_buffer->status > RELEASED &&
+               if (last_deq_buffer->status > ENQUEUED &&
                        last_deq_buffer->status < COMMITTED) {
                        tpl_result_t wait_result;
                        wait_result = tpl_cond_timed_wait(&last_deq_buffer->cond,
@@ -3502,6 +3502,10 @@ __cb_wl_egl_buffer_free(tpl_wl_egl_buffer_t *wl_egl_buffer)
 
                wl_egl_buffer->idx = -1;
        }
+
+       if (wl_egl_surface->last_deq_buffer == wl_egl_buffer)
+               wl_egl_surface->last_deq_buffer = NULL;
+
        tpl_gmutex_unlock(&wl_egl_surface->buffers_mutex);
 
        if (wl_egl_surface->vblank && wl_egl_surface->vblank->waiting_buffers) {