wpe: Run frameComplete outside of images mutex scope
authorPhilippe Normand <philn@igalia.com>
Sat, 19 Oct 2019 11:48:55 +0000 (12:48 +0100)
committerPhilippe Normand <philn@igalia.com>
Thu, 24 Oct 2019 09:41:10 +0000 (09:41 +0000)
If the mutex is locked while running frameComplete there is a potential deadlock
bound to happen when we get a new exported images from the backend.

Fixes #1101

ext/wpe/WPEThreadedView.cpp

index a380ed3..4d6cafa 100644 (file)
@@ -270,26 +270,30 @@ bool WPEThreadedView::initialize(GstWpeSrc* src, GstGLContext* context, GstGLDis
 GstEGLImage* WPEThreadedView::image()
 {
     GstEGLImage* ret = nullptr;
-    GMutexHolder lock(images.mutex);
 
-    GST_TRACE("pending %" GST_PTR_FORMAT " (%d) committed %" GST_PTR_FORMAT " (%d)", images.pending,
-        GST_IS_EGL_IMAGE(images.pending) ? GST_MINI_OBJECT_REFCOUNT_VALUE(GST_MINI_OBJECT_CAST(images.pending)) : 0,
-        images.committed,
-        GST_IS_EGL_IMAGE(images.committed) ? GST_MINI_OBJECT_REFCOUNT_VALUE(GST_MINI_OBJECT_CAST(images.committed)) : 0);
+    {
+        GMutexHolder lock(images.mutex);
+
+        GST_TRACE("pending %" GST_PTR_FORMAT " (%d) committed %" GST_PTR_FORMAT " (%d)", images.pending,
+                  GST_IS_EGL_IMAGE(images.pending) ? GST_MINI_OBJECT_REFCOUNT_VALUE(GST_MINI_OBJECT_CAST(images.pending)) : 0,
+                  images.committed,
+                  GST_IS_EGL_IMAGE(images.committed) ? GST_MINI_OBJECT_REFCOUNT_VALUE(GST_MINI_OBJECT_CAST(images.committed)) : 0);
+
+        if (images.pending) {
+            auto* previousImage = images.committed;
+            images.committed = images.pending;
+            images.pending = nullptr;
 
-    if (images.pending) {
-        auto* previousImage = images.committed;
-        images.committed = images.pending;
-        images.pending = nullptr;
+            if (previousImage)
+                gst_egl_image_unref(previousImage);
+        }
 
-        if (previousImage)
-            gst_egl_image_unref(previousImage);
+        if (images.committed)
+            ret = images.committed;
     }
 
-    if (images.committed) {
-        ret = images.committed;
+    if (ret)
         frameComplete();
-    }
 
     return ret;
 }