[meta-freescale] [meta-fsl-arm][PATCH] gal2d-renderer: Avoid deadlock on exit

Richard Röjfors richard.rojfors at gmail.com
Wed Jan 13 12:47:21 PST 2016


The way the worker thread was shut down was a bit racy.
Make sure to set the flag indicating the thread to stop spinning
before waking up the thread.

Signed-off-by: Richard Röjfors <richard at puffinpack.se>
---
 src/gal2d-renderer.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/gal2d-renderer.c b/src/gal2d-renderer.c
index 7ebbf98..d2a29ff 100644
--- a/src/gal2d-renderer.c
+++ b/src/gal2d-renderer.c
@@ -495,21 +495,21 @@ static void *gal2d_output_worker(void *arg)
 {
     struct weston_output *output = (struct weston_output *)arg;
     struct gal2d_output_state *go = get_output_state(output);
+    int go_on = 1;
 
-    while(1)
+    while(go_on)
     {
-        if(gcoOS_WaitSignal(gcvNULL, go->signal, gcvINFINITE) == gcvSTATUS_OK )
+        int ok = gcoOS_WaitSignal(gcvNULL, go->signal, gcvINFINITE) == gcvSTATUS_OK;
+
+        pthread_mutex_lock(&go->workerMutex);
+        go_on = go->exitWorker == 0;
+        pthread_mutex_unlock(&go->workerMutex);
+
+        if (ok && go_on)
         {
             gal2d_flip_surface(output);
             gcoOS_Signal(gcvNULL,go->busySignal, gcvTRUE);
         }
-        pthread_mutex_lock(&go->workerMutex);
-        if(go->exitWorker == 1)
-        {
-            pthread_mutex_unlock(&go->workerMutex);
-            break;
-        }
-        pthread_mutex_unlock(&go->workerMutex);
     }
     return 0;
 }
@@ -1169,10 +1169,10 @@ gal2d_renderer_output_destroy(struct weston_output *output)
 	}
     else
     {
-        gcoOS_Signal(gcvNULL,go->signal, gcvTRUE);
         pthread_mutex_lock(&go->workerMutex);
         go->exitWorker = 1;
         pthread_mutex_unlock(&go->workerMutex);
+        gcoOS_Signal(gcvNULL,go->signal, gcvTRUE);
         pthread_join(go->workerId, NULL);
     }
 
-- 
2.5.0


More information about the meta-freescale mailing list