From 50d3161ac5d85e37459b48a15ff8a9ff055f6aad Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Wed, 13 May 2015 23:54:52 +1000 Subject: [PATCH] gl: don't deadlock on context creation failure https://bugzilla.gnome.org/show_bug.cgi?id=749284 --- ext/gl/gstglbasemixer.c | 4 +++- ext/gl/gstglimagesink.c | 5 ++++- ext/gl/gstgltestsrc.c | 7 +++++-- gst-libs/gst/gl/gstglbasefilter.c | 8 ++++++-- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/ext/gl/gstglbasemixer.c b/ext/gl/gstglbasemixer.c index 0e670e0..d462c16 100644 --- a/ext/gl/gstglbasemixer.c +++ b/ext/gl/gstglbasemixer.c @@ -477,8 +477,10 @@ gst_gl_base_mixer_decide_allocation (GstGLBaseMixer * mix, GstQuery * query) if (!mix->context) { mix->context = gst_gl_context_new (mix->display); if (!gst_gl_context_create (mix->context, mix->priv->other_context, - &error)) + &error)) { + GST_OBJECT_UNLOCK (mix->display); goto context_error; + } } } while (!gst_gl_display_add_context (mix->display, mix->context)); GST_OBJECT_UNLOCK (mix->display); diff --git a/ext/gl/gstglimagesink.c b/ext/gl/gstglimagesink.c index 15aebe2..0315bfd 100644 --- a/ext/gl/gstglimagesink.c +++ b/ext/gl/gstglimagesink.c @@ -703,8 +703,10 @@ _ensure_gl_setup (GstGLImageSink * gl_sink) gl_sink->display); gl_sink->context = gst_gl_context_new (gl_sink->display); - if (!gl_sink->context) + if (!gl_sink->context) { + GST_OBJECT_UNLOCK (gl_sink->display); goto context_creation_error; + } window = gst_gl_context_get_window (gl_sink->context); @@ -738,6 +740,7 @@ _ensure_gl_setup (GstGLImageSink * gl_sink) if (other_context) gst_object_unref (other_context); gst_object_unref (window); + GST_OBJECT_UNLOCK (gl_sink->display); goto context_error; } diff --git a/ext/gl/gstgltestsrc.c b/ext/gl/gstgltestsrc.c index eba66b0..4dca6cb 100644 --- a/ext/gl/gstgltestsrc.c +++ b/ext/gl/gstgltestsrc.c @@ -786,8 +786,10 @@ gst_gl_test_src_decide_allocation (GstBaseSrc * basesrc, GstQuery * query) gst_gl_display_get_gl_context_for_thread (src->display, NULL); if (!src->context) { src->context = gst_gl_context_new (src->display); - if (!gst_gl_context_create (src->context, src->other_context, &error)) + if (!gst_gl_context_create (src->context, src->other_context, &error)) { + GST_OBJECT_UNLOCK (src->display); goto context_error; + } } } while (!gst_gl_display_add_context (src->display, src->context)); GST_OBJECT_UNLOCK (src->display); @@ -849,7 +851,8 @@ context_error: { GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, ("%s", error->message), (NULL)); - gst_object_unref (src->context); + if (src->context) + gst_object_unref (src->context); src->context = NULL; return FALSE; } diff --git a/gst-libs/gst/gl/gstglbasefilter.c b/gst-libs/gst/gl/gstglbasefilter.c index 0b49e09..e4830d1 100644 --- a/gst-libs/gst/gl/gstglbasefilter.c +++ b/gst-libs/gst/gl/gstglbasefilter.c @@ -333,12 +333,16 @@ gst_gl_base_filter_decide_allocation (GstBaseTransform * trans, gst_gl_display_get_gl_context_for_thread (filter->display, NULL); if (!filter->context) { filter->context = gst_gl_context_new (filter->display); - if (!filter->context) + if (!filter->context) { + GST_OBJECT_UNLOCK (filter->display); goto context_null_error; + } if (!gst_gl_context_create (filter->context, - filter->priv->other_context, &error)) + filter->priv->other_context, &error)) { + GST_OBJECT_UNLOCK (filter->display); goto context_error; + } } } while (!gst_gl_display_add_context (filter->display, filter->context)); GST_OBJECT_UNLOCK (filter->display); -- 2.7.4