use lib::*;
use spin::Mutex;
#[derive(Clone, Default, Debug, PartialEq, Eq)]
pub(crate) struct ThreadsafeWrapper<T>
where
T: fmt::Debug + Default + Clone + PartialEq + Eq,
{
data: Option<T>,
}
impl<T> ThreadsafeWrapper<T>
where
T: fmt::Debug + Default + Clone + PartialEq + Eq,
{
#[inline]
pub(crate) fn measure_and_replace<F, E>(&self, f: F) -> Result<(), E>
where
F: Fn(&T) -> (Result<(), E>, Option<T>),
{
let data = self.data.unwrap_or_else(Default::default);
let (decision, new_data) = f(&data);
if let Some(new_data) = new_data {
self.data.replace(new_data);
}
decision
}
pub(crate) fn snapshot(&self) -> T {
self.data.unwrap_or_else(Default::default).clone()
}
}