uriplaylistbin: add Status::ShuttingDown

Fix a race where we were trying to process new decodedin pads while the
element was being shutdown, resulting in a dead lock.
This commit is contained in:
Guillaume Desmottes 2022-04-08 11:23:31 +02:00
parent 0ed72a360d
commit 69ceaa3a5e

View file

@ -105,6 +105,8 @@ enum Status {
Running, Running,
/// the element stopped because of an error /// the element stopped because of an error
Error, Error,
/// the element is being shut down
ShuttingDown,
} }
impl Status { impl Status {
@ -112,7 +114,7 @@ impl Status {
fn done(&self) -> bool { fn done(&self) -> bool {
match self { match self {
Status::Running => false, Status::Running => false,
Status::Error => true, Status::Error | Status::ShuttingDown => true,
} }
} }
} }
@ -950,6 +952,8 @@ impl ElementImpl for UriPlaylistBin {
let mut state_guard = self.state.lock().unwrap(); let mut state_guard = self.state.lock().unwrap();
let state = state_guard.as_mut().unwrap(); let state = state_guard.as_mut().unwrap();
state.status = Status::ShuttingDown;
// The probe callback owns a ref on the item and so on the sender as well. // The probe callback owns a ref on the item and so on the sender as well.
// As a result we have to explicitly unblock all receivers as dropping the sender // As a result we have to explicitly unblock all receivers as dropping the sender
// is not enough. // is not enough.