[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