use std::sync::{Mutex, TryLockError};
use crate::Error;
pub(crate) fn emit_error<E>(callback: &Mutex<E>, error: Error)
where
E: FnMut(Error) + Send + ?Sized,
{
let mut cb = callback.lock().unwrap_or_else(|e| e.into_inner());
(*cb)(error);
}
#[allow(dead_code)]
pub(crate) fn try_emit_error<E>(callback: &Mutex<E>, error: Error) -> Result<(), Error>
where
E: FnMut(Error) + Send + ?Sized,
{
match callback.try_lock() {
Ok(mut cb) => {
(*cb)(error);
Ok(())
}
Err(TryLockError::Poisoned(e)) => {
(*e.into_inner())(error);
Ok(())
}
Err(TryLockError::WouldBlock) => Err(error),
}
}