use crate::error::Result;
use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard};
pub trait RwLockExt<T> {
fn read_recovered(&self) -> Result<RwLockReadGuard<'_, T>>;
fn write_recovered(&self) -> Result<RwLockWriteGuard<'_, T>>;
}
impl<T> RwLockExt<T> for RwLock<T> {
fn read_recovered(&self) -> Result<RwLockReadGuard<'_, T>> {
match self.read() {
Ok(guard) => Ok(guard),
Err(poisoned) => {
log::error!("RwLock was poisoned (read), recovering; state may be inconsistent");
Ok(poisoned.into_inner())
}
}
}
fn write_recovered(&self) -> Result<RwLockWriteGuard<'_, T>> {
match self.write() {
Ok(guard) => Ok(guard),
Err(poisoned) => {
log::error!("RwLock was poisoned (write), recovering; state may be inconsistent");
Ok(poisoned.into_inner())
}
}
}
}