Skip to contentSkip to conversation

gal2d-renderer: Avoid deadlock on exit

PATCH In review Richard Röjfors 2 participants 4 messages Jan 13, 2016 – Jan 18, 2016

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 gal2d-renderer: Avoid deadlock on exit

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.

---
 src/gal2d-renderer.c | 20 ++++++++++----------

 1 file changed, 10 insertions(+), 10 deletions(-)
src/gal2d-renderer.c +0 -0
index 7ebbf98..d2a29ff 100644
@@ -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);
     }

Signature · 1 line
2.5.0
#1 lore raw
Quoted 5 lines · Richard Röjfors

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.

The patch is good and well commented; please include this on the weston recipe and please also add the Upstream-Status: Pending field on this so NXP can pick it for their next release.

Signature · 3 lines
Otavio Salvador                             O.S. Systems
http://www.ossystems.com.br        http://code.ossystems.com.br
Mobile: +55 (53) 9981-7854            Mobile: +1 (347) 903-9750
#2 lore raw
Quoted 7 lines · Otavio Salvador
Quoted 4 lines · Richard Röjfors

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.

Quoted 5 lines
Quoted 1 line

The patch is good and well commented; please include this on the weston recipe and please also add the Upstream-Status: Pending field on this so NXP can pick it for their next release.

Will do!

--Richard

#3 lore raw
Quoted 9 lines · Richard Röjfors
Quoted 7 lines · Otavio Salvador
Quoted 4 lines · Richard Röjfors

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.

Quoted 8 lines
Quoted 5 lines
Quoted 1 line

The patch is good and well commented; please include this on the weston recipe and please also add the Upstream-Status: Pending field on this so NXP can pick it for their next release.

Will do!

I've sent it in a separate mail. Please let me know if the formatting isn't as you expect.

Thanks,
--Richard