use super::StableDeref;
use std::ops::{Deref, DerefMut};
#[cfg(shuttle)]
use shuttle::sync;
#[cfg(not(shuttle))]
use std::sync;
use sync::Mutex as InnerMutex;
use sync::MutexGuard as InnerMutexGuard;
pub use sync::*;
use std::sync::{LockResult, PoisonError};
pub struct MutexGuard<'a, T>(InnerMutexGuard<'a, T>);
impl<T> Deref for MutexGuard<'_, T> {
type Target = T;
fn deref(&self) -> &Self::Target {
self.0.deref()
}
}
impl<T> DerefMut for MutexGuard<'_, T> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.0.deref_mut()
}
}
#[derive(Debug, Default)]
pub struct Mutex<T>(InnerMutex<T>);
unsafe impl<T> StableDeref for MutexGuard<'_, T> {}
impl<T> Mutex<T> {
pub fn lock(&self) -> LockResult<MutexGuard<T>> {
match self.0.lock() {
Ok(inner_guard) => Ok(self::MutexGuard(inner_guard)),
Err(err) => Err(PoisonError::new(self::MutexGuard(err.into_inner()))),
}
}
pub fn new(t: T) -> Self {
Self(InnerMutex::new(t))
}
}