1*5b79f08aSalexlapa use std::{ops, sync}; 2ffe74184SMartin Algesten 3*5b79f08aSalexlapa /// A synchronous mutual exclusion primitive useful for protecting shared data. 4*5b79f08aSalexlapa #[derive(Default, Debug)] 5*5b79f08aSalexlapa pub struct Mutex<T>(sync::Mutex<T>); 6ffe74184SMartin Algesten 7*5b79f08aSalexlapa impl<T> Mutex<T> { 8*5b79f08aSalexlapa /// Creates a new mutex in an unlocked state ready for use. new(value: T) -> Self9*5b79f08aSalexlapa pub fn new(value: T) -> Self { 10*5b79f08aSalexlapa Self(sync::Mutex::new(value)) 11*5b79f08aSalexlapa } 12*5b79f08aSalexlapa 13*5b79f08aSalexlapa /// Acquires a mutex, blocking the current thread until it is able to do so. lock(&self) -> MutexGuard<'_, T>14*5b79f08aSalexlapa pub fn lock(&self) -> MutexGuard<'_, T> { 15*5b79f08aSalexlapa let guard = self.0.lock().unwrap(); 16*5b79f08aSalexlapa 17*5b79f08aSalexlapa MutexGuard(guard) 18*5b79f08aSalexlapa } 19*5b79f08aSalexlapa 20*5b79f08aSalexlapa /// Consumes this mutex, returning the underlying data. into_inner(self) -> T21*5b79f08aSalexlapa pub fn into_inner(self) -> T { 22*5b79f08aSalexlapa self.0.into_inner().unwrap() 23*5b79f08aSalexlapa } 24*5b79f08aSalexlapa } 25*5b79f08aSalexlapa 26*5b79f08aSalexlapa /// An RAII implementation of a "scoped lock" of a mutex. When this structure is 27*5b79f08aSalexlapa /// dropped (falls out of scope), the lock will be unlocked. 28*5b79f08aSalexlapa pub struct MutexGuard<'a, T>(sync::MutexGuard<'a, T>); 29*5b79f08aSalexlapa 30*5b79f08aSalexlapa impl<'a, T> ops::Deref for MutexGuard<'a, T> { 31*5b79f08aSalexlapa type Target = T; 32*5b79f08aSalexlapa deref(&self) -> &Self::Target33*5b79f08aSalexlapa fn deref(&self) -> &Self::Target { 34*5b79f08aSalexlapa &self.0 35*5b79f08aSalexlapa } 36*5b79f08aSalexlapa } 37*5b79f08aSalexlapa 38*5b79f08aSalexlapa impl<'a, T> ops::DerefMut for MutexGuard<'a, T> { deref_mut(&mut self) -> &mut Self::Target39*5b79f08aSalexlapa fn deref_mut(&mut self) -> &mut Self::Target { 40*5b79f08aSalexlapa &mut self.0 41*5b79f08aSalexlapa } 42*5b79f08aSalexlapa } 43*5b79f08aSalexlapa 44*5b79f08aSalexlapa /// A synchronous reader-writer lock. 45*5b79f08aSalexlapa #[derive(Default, Debug)] 46*5b79f08aSalexlapa pub struct RwLock<T>(sync::RwLock<T>); 47*5b79f08aSalexlapa 48*5b79f08aSalexlapa impl<T> RwLock<T> { 49*5b79f08aSalexlapa /// Creates a new mutex in an unlocked state ready for use. new(value: T) -> Self50*5b79f08aSalexlapa pub fn new(value: T) -> Self { 51*5b79f08aSalexlapa Self(sync::RwLock::new(value)) 52*5b79f08aSalexlapa } 53*5b79f08aSalexlapa 54*5b79f08aSalexlapa /// Locks this rwlock with shared read access, blocking the current thread 55*5b79f08aSalexlapa /// until it can be acquired. read(&self) -> RwLockReadGuard<'_, T>56*5b79f08aSalexlapa pub fn read(&self) -> RwLockReadGuard<'_, T> { 57*5b79f08aSalexlapa let guard = self.0.read().unwrap(); 58*5b79f08aSalexlapa 59*5b79f08aSalexlapa RwLockReadGuard(guard) 60*5b79f08aSalexlapa } 61*5b79f08aSalexlapa 62*5b79f08aSalexlapa /// Locks this rwlock with exclusive write access, blocking the current 63*5b79f08aSalexlapa /// thread until it can be acquired. write(&self) -> RwLockWriteGuard<'_, T>64*5b79f08aSalexlapa pub fn write(&self) -> RwLockWriteGuard<'_, T> { 65*5b79f08aSalexlapa let guard = self.0.write().unwrap(); 66*5b79f08aSalexlapa 67*5b79f08aSalexlapa RwLockWriteGuard(guard) 68*5b79f08aSalexlapa } 69*5b79f08aSalexlapa } 70*5b79f08aSalexlapa 71*5b79f08aSalexlapa /// RAII structure used to release the shared read access of a lock when 72*5b79f08aSalexlapa /// dropped. 73*5b79f08aSalexlapa pub struct RwLockReadGuard<'a, T>(sync::RwLockReadGuard<'a, T>); 74*5b79f08aSalexlapa 75*5b79f08aSalexlapa impl<'a, T> ops::Deref for RwLockReadGuard<'a, T> { 76*5b79f08aSalexlapa type Target = T; 77*5b79f08aSalexlapa deref(&self) -> &Self::Target78*5b79f08aSalexlapa fn deref(&self) -> &Self::Target { 79*5b79f08aSalexlapa &self.0 80*5b79f08aSalexlapa } 81*5b79f08aSalexlapa } 82*5b79f08aSalexlapa 83*5b79f08aSalexlapa /// RAII structure used to release the exclusive write access of a lock when 84*5b79f08aSalexlapa /// dropped. 85*5b79f08aSalexlapa pub struct RwLockWriteGuard<'a, T>(sync::RwLockWriteGuard<'a, T>); 86*5b79f08aSalexlapa 87*5b79f08aSalexlapa impl<'a, T> ops::Deref for RwLockWriteGuard<'a, T> { 88*5b79f08aSalexlapa type Target = T; 89*5b79f08aSalexlapa deref(&self) -> &Self::Target90*5b79f08aSalexlapa fn deref(&self) -> &Self::Target { 91*5b79f08aSalexlapa &self.0 92*5b79f08aSalexlapa } 93*5b79f08aSalexlapa } 94*5b79f08aSalexlapa 95*5b79f08aSalexlapa impl<'a, T> ops::DerefMut for RwLockWriteGuard<'a, T> { deref_mut(&mut self) -> &mut Self::Target96*5b79f08aSalexlapa fn deref_mut(&mut self) -> &mut Self::Target { 97*5b79f08aSalexlapa &mut self.0 98*5b79f08aSalexlapa } 99*5b79f08aSalexlapa } 100