splitmuxsink: Avoid deadlock on release, harder
authorJan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com>
Tue, 26 Jan 2021 15:33:25 +0000 (16:33 +0100)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Tue, 17 May 2022 09:24:10 +0000 (09:24 +0000)
Unlock after broadcasting and wait for the pad to be free before
relocking the muxer, giving the input probe a chance to react to our
broadcast.

Improves the fix from
https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/838.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1030>

subprojects/gst-plugins-good/gst/multifile/gstsplitmuxsink.c

index 1846f42..e517800 100644 (file)
@@ -3576,6 +3576,9 @@ gst_splitmux_sink_release_pad (GstElement * element, GstPad * pad)
   /* Remove the context from our consideration */
   splitmux->contexts = g_list_remove (splitmux->contexts, ctx);
 
+  ctx->is_releasing = TRUE;
+  GST_SPLITMUX_BROADCAST_INPUT (splitmux);
+
   GST_SPLITMUX_UNLOCK (splitmux);
 
   if (ctx->sink_pad_block_id) {
@@ -3586,10 +3589,10 @@ gst_splitmux_sink_release_pad (GstElement * element, GstPad * pad)
   if (ctx->src_pad_block_id)
     gst_pad_remove_probe (ctx->srcpad, ctx->src_pad_block_id);
 
+  /* Wait for the pad to be free */
+  GST_PAD_STREAM_LOCK (pad);
   GST_SPLITMUX_LOCK (splitmux);
-
-  ctx->is_releasing = TRUE;
-  GST_SPLITMUX_BROADCAST_INPUT (splitmux);
+  GST_PAD_STREAM_UNLOCK (pad);
 
   /* Can release the context now */
   mq_stream_ctx_free (ctx);