From 0f03e33b03456d673550ad72d5dc14fc27ecbea3 Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Sat, 19 Oct 2019 12:48:55 +0100 Subject: [PATCH] wpe: Run frameComplete outside of images mutex scope 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 | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/ext/wpe/WPEThreadedView.cpp b/ext/wpe/WPEThreadedView.cpp index a380ed39ca..4d6cafa01c 100644 --- a/ext/wpe/WPEThreadedView.cpp +++ b/ext/wpe/WPEThreadedView.cpp @@ -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); - if (images.pending) { - auto* previousImage = images.committed; - images.committed = images.pending; - images.pending = nullptr; + 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 (previousImage) - gst_egl_image_unref(previousImage); + if (images.pending) { + auto* previousImage = images.committed; + images.committed = images.pending; + images.pending = nullptr; + + if (previousImage) + gst_egl_image_unref(previousImage); + } + + if (images.committed) + ret = images.committed; } - if (images.committed) { - ret = images.committed; + if (ret) frameComplete(); - } return ret; }