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>
This commit is contained in:
Guillaume Desmottes 2023-08-14 11:39:49 +02:00
parent 100333c021
commit d3da30be6d

View file

@ -829,11 +829,14 @@ impl FallbackSwitch {
is_active = self.active_sinkpad.lock().as_ref() == Some(pad); 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 { if pad_state.flushing {
debug!(CAT, imp: self, "Flushing"); debug!(CAT, imp: self, "Flushing");
return Err(gst::FlowError::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 is_active {
if start_running_time 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 { if let Some(running_time) = end_running_time {
pad_state.current_running_time = Some(running_time); pad_state.current_running_time = Some(running_time);
} }