     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

    use std::sync::{self, MutexGuard, TryLockError};

    /// Adapter for `std::Mutex` that removes the poisoning aspects
    // from its api
    #[derive(Debug)]
    pub(crate) struct Mutex<T: ?Sized>(sync::Mutex<T>);

    #[allow(dead_code)]
    impl<T> Mutex<T> {
        #[inline]
        pub(crate) fn new(t: T) -> Mutex<T> {
            Mutex(sync::Mutex::new(t))
        }

        #[inline]
        pub(crate) fn lock(&self) -> MutexGuard<'_, T> {
            match self.0.lock() {
                Ok(guard) => guard,
                Err(p_err) => p_err.into_inner(),
            }
        }

        #[inline]
        pub(crate) fn try_lock(&self) -> Option<MutexGuard<'_, T>> {
            match self.0.try_lock() {
                Ok(guard) => Some(guard),
                Err(TryLockError::Poisoned(p_err)) => Some(p_err.into_inner()),
                Err(TryLockError::WouldBlock) => None,
            }
        }
    }