[meta-freescale] [meta-fsl-arm][PATCH] weston: gal2d-renderer: Fix deadlock on exit
Richard Röjfors
richard.rojfors at gmail.com
Mon Jan 18 08:22:30 PST 2016
There is a race between the worker thread flipping the buffers
and the main thread on exit, this patch fixes that.
Signed-off-by: Richard Röjfors <richard at puffinpack.se>
---
...002-gal2d-renderer-Avoid-deadlock-on-exit.patch | 69 ++++++++++++++++++++++
recipes-graphics/wayland/weston_%.bbappend | 5 +-
2 files changed, 73 insertions(+), 1 deletion(-)
create mode 100644 recipes-graphics/wayland/weston/0002-gal2d-renderer-Avoid-deadlock-on-exit.patch
diff --git a/recipes-graphics/wayland/weston/0002-gal2d-renderer-Avoid-deadlock-on-exit.patch b/recipes-graphics/wayland/weston/0002-gal2d-renderer-Avoid-deadlock-on-exit.patch
new file mode 100644
index 0000000..cb6478d
--- /dev/null
+++ b/recipes-graphics/wayland/weston/0002-gal2d-renderer-Avoid-deadlock-on-exit.patch
@@ -0,0 +1,69 @@
+From e032db2353427d174924f456a39c58de374acb33 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Richard=20R=C3=B6jfors?= <richard at puffinpack.se>
+Date: Wed, 13 Jan 2016 21:04:08 +0100
+Subject: [PATCH] gal2d-renderer: Avoid deadlock on exit
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+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.
+
+Upstream-Status: Pending
+
+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
+
diff --git a/recipes-graphics/wayland/weston_%.bbappend b/recipes-graphics/wayland/weston_%.bbappend
index a7496da..f41b5af 100644
--- a/recipes-graphics/wayland/weston_%.bbappend
+++ b/recipes-graphics/wayland/weston_%.bbappend
@@ -1,6 +1,9 @@
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
-SRC_URI_append_mx6 = " file://0001-MGS-840-Add-i.MX6-support-for-weston.patch"
+SRC_URI_append_mx6 = " \
+ file://0001-MGS-840-Add-i.MX6-support-for-weston.patch \
+ file://0002-gal2d-renderer-Avoid-deadlock-on-exit.patch \
+"
PACKAGECONFIG_append_mx6q = " cairo-glesv2"
PACKAGECONFIG_append_mx6dl = " cairo-glesv2"
--
2.5.0
More information about the meta-freescale
mailing list