summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
authorLouis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk>2013-02-19 13:01:37 -0500
committerThiago Santos <thiago.sousa.santos@collabora.com>2013-05-07 20:02:41 -0300
commitf0211e5b7b55d607086bbdb7458981f9a551c661 (patch)
tree3812f684dd5f3d296f85d180e6e944922f80da0f /gst-libs
parent99efe87b5dd357cff504cfdca340ec0368af2616 (diff)
downloadgstreamer-plugins-bad-f0211e5b7b55d607086bbdb7458981f9a551c661.tar.gz
uridownloader: unlock mutex when switching urisrc state to NULL to avoid deadlock
When chain method was called after gst_uri_downloader_stop and before state has been changed to NULL, execution was blocking on g_mutex_lock. Conflicts: gst-libs/gst/uridownloader/gsturidownloader.c
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/uridownloader/gsturidownloader.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/gst-libs/gst/uridownloader/gsturidownloader.c b/gst-libs/gst/uridownloader/gsturidownloader.c
index 142bb2a56..15af6a498 100644
--- a/gst-libs/gst/uridownloader/gsturidownloader.c
+++ b/gst-libs/gst/uridownloader/gsturidownloader.c
@@ -243,10 +243,15 @@ done:
}
}
+/* Must be called with mutex locked. */
static void
gst_uri_downloader_stop (GstUriDownloader * downloader)
{
GstPad *pad;
+ GstElement *urisrc;
+
+ if (!downloader->priv->urisrc)
+ return;
GST_DEBUG_OBJECT (downloader, "Stopping source element %s",
GST_ELEMENT_NAME (downloader->priv->urisrc));
@@ -259,14 +264,23 @@ gst_uri_downloader_stop (GstUriDownloader * downloader)
gst_pad_unlink (pad, downloader->priv->pad);
gst_object_unref (pad);
}
- /* set the element state to NULL */
- gst_element_set_state (downloader->priv->urisrc, GST_STATE_NULL);
- gst_element_get_state (downloader->priv->urisrc, NULL, NULL,
- GST_CLOCK_TIME_NONE);
- gst_element_set_bus (downloader->priv->urisrc, NULL);
- gst_object_unref (downloader->priv->urisrc);
+ urisrc = downloader->priv->urisrc;
downloader->priv->urisrc = NULL;
+ /* unlock so it doesn't block on chain function while changing state */
+ g_mutex_unlock (&downloader->priv->lock);
+
+ GST_DEBUG_OBJECT (downloader, "Stopping source element %s",
+ GST_ELEMENT_NAME (urisrc));
+
+ /* set the element state to NULL */
+ gst_element_set_state (urisrc, GST_STATE_NULL);
+ gst_element_get_state (urisrc, NULL, NULL, GST_CLOCK_TIME_NONE);
+ gst_element_set_bus (urisrc, NULL);
+ gst_object_unref (urisrc);
+
+ /* caller expects the mutex to be locked */
+ g_mutex_lock (&downloader->priv->lock);
gst_bus_set_flushing (downloader->priv->bus, TRUE);
}