discoverer: Avoid race of adding elements while stopping
authorEdward Hervey <edward@centricular.com>
Sat, 4 Nov 2017 15:13:06 +0000 (16:13 +0100)
committerEdward Hervey <bilboed@bilboed.com>
Sat, 4 Nov 2017 15:13:06 +0000 (16:13 +0100)
This would result in a lot of warnings regarding elements not being
in NULL state when removed, or even leaked elements.

Instead make sure we take the lock and check whether we are processing
or not before allocating or adding anything to the pipeline

gst-libs/gst/pbutils/gstdiscoverer.c

index 78b1399..f7d014e 100644 (file)
@@ -613,6 +613,14 @@ uridecodebin_pad_added_cb (GstElement * uridecodebin, GstPad * pad,
 
   GST_DEBUG_OBJECT (dc, "pad %s:%s", GST_DEBUG_PAD_NAME (pad));
 
+  DISCO_LOCK (dc);
+
+  if (dc->priv->running == FALSE) {
+    GST_DEBUG_OBJECT (dc, "We are stopping");
+    DISCO_UNLOCK (dc);
+    return;
+  }
+
   ps = g_slice_new0 (PrivateStream);
 
   ps->dc = dc;
@@ -644,9 +652,7 @@ uridecodebin_pad_added_cb (GstElement * uridecodebin, GstPad * pad,
     gst_pad_add_probe (sinkpad, GST_PAD_PROBE_TYPE_DATA_DOWNSTREAM,
         (GstPadProbeCallback) got_subtitle_data, dc, NULL);
     g_object_set (ps->sink, "async", FALSE, NULL);
-    DISCO_LOCK (dc);
     dc->priv->pending_subtitle_pads++;
-    DISCO_UNLOCK (dc);
   }
 
   gst_caps_unref (caps);
@@ -670,7 +676,6 @@ uridecodebin_pad_added_cb (GstElement * uridecodebin, GstPad * pad,
   gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
       (GstPadProbeCallback) _event_probe, ps, NULL);
 
-  DISCO_LOCK (dc);
   dc->priv->streams = g_list_append (dc->priv->streams, ps);
   DISCO_UNLOCK (dc);
 
@@ -687,6 +692,7 @@ error:
   if (ps->sink)
     gst_object_unref (ps->sink);
   g_slice_free (PrivateStream, ps);
+  DISCO_UNLOCK (dc);
   return;
 }