discoverer: Make sure we call _stop() before being freed

This ensures that everything is properly cleaned up before the
GstDiscoverer object is freed. Specifically, it makes sure that we've
removed the async timeout callback before freeing the object to avoid a
potential crash later on.

https://bugzilla.gnome.org/show_bug.cgi?id=639755
This commit is contained in:
Arun Raghavan 2011-01-18 00:08:32 +05:30 committed by Tim-Philipp Müller
parent 3a165c60bf
commit e730ce71dc

View file

@ -304,7 +304,8 @@ discoverer_reset (GstDiscoverer * dc)
dc->priv->pending_uris = NULL;
}
gst_element_set_state ((GstElement *) dc->priv->pipeline, GST_STATE_NULL);
if (dc->priv->pipeline)
gst_element_set_state ((GstElement *) dc->priv->pipeline, GST_STATE_NULL);
}
static void
@ -325,6 +326,8 @@ gst_discoverer_dispose (GObject * obj)
dc->priv->bus = NULL;
}
gst_discoverer_stop (dc);
if (dc->priv->lock) {
g_mutex_free (dc->priv->lock);
dc->priv->lock = NULL;
@ -1271,9 +1274,11 @@ gst_discoverer_stop (GstDiscoverer * discoverer)
/* We prevent any further processing by setting the bus to
* flushing and setting the pipeline to READY.
* _reset() will take care of the rest of the cleanup */
gst_bus_set_flushing (discoverer->priv->bus, TRUE);
gst_element_set_state ((GstElement *) discoverer->priv->pipeline,
GST_STATE_READY);
if (discoverer->priv->bus)
gst_bus_set_flushing (discoverer->priv->bus, TRUE);
if (discoverer->priv->pipeline)
gst_element_set_state ((GstElement *) discoverer->priv->pipeline,
GST_STATE_READY);
}
discoverer->priv->running = FALSE;
DISCO_UNLOCK (discoverer);