use std::sync::{MutexGuard, PoisonError, RwLockReadGuard, RwLockWriteGuard};
pub fn write_or_recover<'a, T>(
result: Result<RwLockWriteGuard<'a, T>, PoisonError<RwLockWriteGuard<'a, T>>>,
lock_name: &str,
) -> RwLockWriteGuard<'a, T> {
result.unwrap_or_else(|p| {
tracing::warn!(lock = lock_name, "RwLock poisoned (write), recovering");
p.into_inner()
})
}
pub fn read_or_recover<'a, T>(
result: Result<RwLockReadGuard<'a, T>, PoisonError<RwLockReadGuard<'a, T>>>,
lock_name: &str,
) -> RwLockReadGuard<'a, T> {
result.unwrap_or_else(|p| {
tracing::warn!(lock = lock_name, "RwLock poisoned (read), recovering");
p.into_inner()
})
}
pub fn lock_or_recover<'a, T>(
result: Result<MutexGuard<'a, T>, PoisonError<MutexGuard<'a, T>>>,
lock_name: &str,
) -> MutexGuard<'a, T> {
result.unwrap_or_else(|p| {
tracing::warn!(lock = lock_name, "Mutex poisoned, recovering");
p.into_inner()
})
}