[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