From 9a8cb299702c6e8c01b5f4a366f7cffc6b13f97a Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Sat, 4 Nov 2017 16:13:06 +0100 Subject: [PATCH] discoverer: Avoid race of adding elements while stopping 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 | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/gst-libs/gst/pbutils/gstdiscoverer.c b/gst-libs/gst/pbutils/gstdiscoverer.c index 78b13993e1..f7d014ec74 100644 --- a/gst-libs/gst/pbutils/gstdiscoverer.c +++ b/gst-libs/gst/pbutils/gstdiscoverer.c @@ -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; }