From 2e4135cefff87e8e960bccefe67637949b819eac Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Mon, 14 Aug 2023 10:41:00 +0200 Subject: [PATCH] fallbackswitch: ensure strict ordering when taking mutexes Should prevent deadlocks. Part-of: --- utils/fallbackswitch/src/fallbackswitch/imp.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/utils/fallbackswitch/src/fallbackswitch/imp.rs b/utils/fallbackswitch/src/fallbackswitch/imp.rs index 8c4b7f93..b1840c29 100644 --- a/utils/fallbackswitch/src/fallbackswitch/imp.rs +++ b/utils/fallbackswitch/src/fallbackswitch/imp.rs @@ -36,6 +36,14 @@ static CAT: Lazy = Lazy::new(|| { ) }); +/* Mutex locking ordering: + - self.settings + - self.state + - self.active_sinkpad + - pad.settings + - pad.state +*/ + #[derive(Debug)] #[allow(clippy::large_enum_variant)] enum CapsInfo { @@ -473,8 +481,8 @@ impl FallbackSwitch { if active_sinkpad.as_ref() == Some(pad) { continue; } - let pad_state = pad_imp.state.lock(); let pad_settings = pad_imp.settings.lock().clone(); + let pad_state = pad_imp.state.lock(); #[allow(clippy::collapsible_if)] /* If this pad has data that arrived within the 'timeout' window * before the timeout fired, we can switch to it */ @@ -638,8 +646,8 @@ impl FallbackSwitch { buffer: gst::Buffer, from_gap: Option<&gst::event::Gap>, ) -> Result { - let mut state = self.state.lock(); let settings = self.settings.lock().clone(); + let mut state = self.state.lock(); let pad = pad.downcast_ref::().unwrap(); let pad_imp = pad.imp(); @@ -1176,8 +1184,8 @@ impl FallbackSwitch { } } - let mut state = self.state.lock(); let settings = self.settings.lock().clone(); + let mut state = self.state.lock(); min_latency = min_latency.max(settings.min_upstream_latency); state.upstream_latency = min_latency; log!(CAT, obj: pad, "Upstream latency {}", min_latency);