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
This commit is contained in:
Edward Hervey 2017-11-04 16:13:06 +01:00 committed by Edward Hervey
parent c81e3e6fce
commit 9a8cb29970

View 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;
}