From 799b1670bbae8bf38f92280151eb43d8d41e0b67 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Wed, 31 May 2017 02:46:01 +0200 Subject: [PATCH] adaptivedemux: release the manifest lock ... before broadcasting preroll. The deadlock was as follows: -> The subclass pushes a buffer on a newly-created stream in T1 -> We take the preroll lock in T1, to handle_preroll -> The demuxer is stopped in T2, we take the MANIFEST_LOCK -> T1 starts blocking because it received a reconfigure event and needs to take the MANIFEST_LOCK -> T2 deadlocks because it now wants the preroll_lock. https://bugzilla.gnome.org/show_bug.cgi?id=783255 --- gst-libs/gst/adaptivedemux/gstadaptivedemux.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c index 4f80eb6..392e1e1 100644 --- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c +++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c @@ -1974,9 +1974,11 @@ gst_adaptive_demux_stop_tasks (GstAdaptiveDemux * demux, gboolean stop_updates) g_mutex_unlock (&stream->fragment_download_lock); } + GST_MANIFEST_UNLOCK (demux); g_mutex_lock (&demux->priv->preroll_lock); g_cond_broadcast (&demux->priv->preroll_cond); g_mutex_unlock (&demux->priv->preroll_lock); + GST_MANIFEST_LOCK (demux); g_mutex_lock (&demux->priv->manifest_update_lock); g_cond_broadcast (&demux->priv->manifest_cond); -- 2.7.4