gl: don't deadlock on context creation failure
authorMatthew Waters <matthew@centricular.com>
Wed, 13 May 2015 13:54:52 +0000 (23:54 +1000)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:32:01 +0000 (19:32 +0000)
https://bugzilla.gnome.org/show_bug.cgi?id=749284

ext/gl/gstglbasemixer.c
ext/gl/gstglimagesink.c
ext/gl/gstgltestsrc.c
gst-libs/gst/gl/gstglbasefilter.c

index 0e670e0..d462c16 100644 (file)
@@ -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);
index 15aebe2..0315bfd 100644 (file)
@@ -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;
       }
 
index eba66b0..4dca6cb 100644 (file)
@@ -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;
   }
index 0b49e09..e4830d1 100644 (file)
@@ -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);