diff options
author | Guillaume Desmottes <guillaume.desmottes@onestream.live> | 2023-08-14 12:39:49 +0300 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@onestream.live> | 2023-08-14 14:16:37 +0300 |
commit | d3da30be6d94ca0293d27bc0dd563f1092210b42 (patch) | |
tree | abb2b75b08e0c05834194a9914f014b47d99f429 /utils | |
parent | 100333c021a457774e8b2f5d16453437cff1348d (diff) |
fallbackswitch: prevent deadlocks in chain function
Calling schedule_timeout() may result in handle_timeout() being called right away,
which will need pad state locks which was still hold in chain().
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1300>
Diffstat (limited to 'utils')
-rw-r--r-- | utils/fallbackswitch/src/fallbackswitch/imp.rs | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/utils/fallbackswitch/src/fallbackswitch/imp.rs b/utils/fallbackswitch/src/fallbackswitch/imp.rs index e74b79f54..477ee8089 100644 --- a/utils/fallbackswitch/src/fallbackswitch/imp.rs +++ b/utils/fallbackswitch/src/fallbackswitch/imp.rs @@ -829,11 +829,14 @@ impl FallbackSwitch { is_active = self.active_sinkpad.lock().as_ref() == Some(pad); } - let mut pad_state = pad_imp.state.lock(); + let pad_state = pad_imp.state.lock(); if pad_state.flushing { debug!(CAT, imp: self, "Flushing"); return Err(gst::FlowError::Flushing); } + // calling schedule_timeout() may result in handle_timeout() being called right away, + // which will need pad state locks, so drop it now to prevent deadlocks. + drop(pad_state); if is_active { if start_running_time @@ -879,6 +882,8 @@ impl FallbackSwitch { } } + let mut pad_state = pad_imp.state.lock(); + if let Some(running_time) = end_running_time { pad_state.current_running_time = Some(running_time); } |