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 <[email protected]> --- 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 -- _______________________________________________ meta-freescale mailing list [email protected] https://lists.yoctoproject.org/listinfo/meta-freescale
