Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sdroege/gst-plugin-rs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@onestream.live>2023-08-14 12:39:49 +0300
committerGuillaume Desmottes <guillaume.desmottes@onestream.live>2023-08-14 14:16:37 +0300
commitd3da30be6d94ca0293d27bc0dd563f1092210b42 (patch)
treeabb2b75b08e0c05834194a9914f014b47d99f429 /utils
parent100333c021a457774e8b2f5d16453437cff1348d (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.rs7
1 files changed, 6 insertions, 1 deletions
diff --git a/utils/fallbackswitch/src/fallbackswitch/imp.rs b/utils/fallbackswitch/src/fallbackswitch/imp.rs
index e74b79f5..477ee808 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);
}