From 8a1fab959441309a1d9bac45d45f39bb08a22d74 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Fri, 12 Jul 2024 11:07:47 +1000 Subject: [PATCH] splitmuxsrc: Drop lock when unpreparing parts Parts may emit bus messages that want to take the splitmuxsrc lock and prevent the downward state change. Avoid a deadlock after a part sends an error message by taking a ref and dropping the lock around the unprepare call Part-of: --- .../gst-plugins-good/gst/multifile/gstsplitmuxsrc.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/subprojects/gst-plugins-good/gst/multifile/gstsplitmuxsrc.c b/subprojects/gst-plugins-good/gst/multifile/gstsplitmuxsrc.c index 1e18da8de6..5ca9aa157c 100644 --- a/subprojects/gst-plugins-good/gst/multifile/gstsplitmuxsrc.c +++ b/subprojects/gst-plugins-good/gst/multifile/gstsplitmuxsrc.c @@ -1306,7 +1306,13 @@ gst_splitmux_src_stop (GstSplitMuxSrc * splitmux) for (i = 0; i < splitmux->num_parts; i++) { if (splitmux->parts[i] == NULL) continue; - gst_splitmux_part_reader_unprepare (splitmux->parts[i]); + + /* Take a ref so we can drop the lock around calling unprepare */ + GstSplitMuxPartReader *part = g_object_ref (splitmux->parts[i]); + SPLITMUX_SRC_UNLOCK (splitmux); + gst_splitmux_part_reader_unprepare (part); + g_object_unref (part); + SPLITMUX_SRC_LOCK (splitmux); } SPLITMUX_SRC_PADS_WLOCK (splitmux); @@ -1946,10 +1952,11 @@ do_lookahead_check (GstSplitMuxSrc * splitmux) i, reader, splitmux->cur_part); gst_object_ref (reader); add_to_active_readers (splitmux, reader, FALSE); - SPLITMUX_SRC_UNLOCK (splitmux); /* Drop lock before calling activate, as it might call back * into the splitmuxsrc when exposing pads */ + SPLITMUX_SRC_UNLOCK (splitmux); + gst_splitmux_part_reader_prepare (reader); gst_object_unref (reader); /* Only prepare one part at a time */