From 041c6f5473240288d8871d6cd67625f5968c5bb1 Mon Sep 17 00:00:00 2001 From: Ramin Azarmehr Date: Wed, 13 Jun 2018 16:34:45 -0400 Subject: [PATCH] renderer: prevent losing condvar signals for fence_cond Signaling a CondVar without the Mutex locked could possibly cause the waiting-fence to miss the wakeup. More info: https://stackoverflow.com/questions/4544234/calling-pthread-cond-signal-without-locking-mutex Reviewed-by: Dave Airlie --- src/vrend_renderer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index d1f773d..9ca4548 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -4178,9 +4178,9 @@ static void vrend_free_sync_thread(void) pipe_mutex_lock(vrend_state.fence_mutex); vrend_state.stop_sync_thread = true; + pipe_condvar_signal(vrend_state.fence_cond); pipe_mutex_unlock(vrend_state.fence_mutex); - pipe_condvar_signal(vrend_state.fence_cond); pipe_thread_wait(vrend_state.sync_thread); vrend_state.sync_thread = 0; @@ -6427,8 +6427,8 @@ int vrend_renderer_create_fence(int client_fence_id, uint32_t ctx_id) if (vrend_state.sync_thread) { pipe_mutex_lock(vrend_state.fence_mutex); list_addtail(&fence->fences, &vrend_state.fence_wait_list); - pipe_mutex_unlock(vrend_state.fence_mutex); pipe_condvar_signal(vrend_state.fence_cond); + pipe_mutex_unlock(vrend_state.fence_mutex); } else list_addtail(&fence->fences, &vrend_state.fence_list); return 0;