fallbacksrc: Fix timeout scheduling

Other thread can schedule the timeout (e.g., unblock signal
or active pad change) while state lock is released

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1384>
This commit is contained in:
Seungha Yang 2023-11-09 01:45:51 +09:00 committed by Sebastian Dröge
parent 9250c592a7
commit 8a04a38631

View file

@ -3206,20 +3206,23 @@ impl FallbackSrc {
} else { } else {
let mut state_guard = imp.state.lock(); let mut state_guard = imp.state.lock();
let state = state_guard.as_mut().expect("no state"); let state = state_guard.as_mut().expect("no state");
if fallback_source { let source = if fallback_source {
assert!(state if let Some(source) = &state.fallback_source {
.fallback_source source
.as_ref() } else {
.map(|s| s.restart_timeout.is_none()) return;
.unwrap_or(true)); }
} else { } else {
assert!(state.source.restart_timeout.is_none()); &state.source
};
if source.restart_timeout.is_none() {
imp.schedule_source_restart_timeout(
state,
gst::ClockTime::ZERO,
fallback_source,
);
} }
imp.schedule_source_restart_timeout(
state,
gst::ClockTime::ZERO,
fallback_source,
);
} }
}); });
}) })