diff options
Diffstat (limited to 'src/loom')
-rw-r--r-- | src/loom/mocked.rs | 27 | ||||
-rw-r--r-- | src/loom/mod.rs | 2 | ||||
-rw-r--r-- | src/loom/std/atomic_ptr.rs | 8 | ||||
-rw-r--r-- | src/loom/std/atomic_u16.rs | 2 | ||||
-rw-r--r-- | src/loom/std/atomic_u32.rs | 2 | ||||
-rw-r--r-- | src/loom/std/atomic_u8.rs | 2 | ||||
-rw-r--r-- | src/loom/std/atomic_usize.rs | 2 | ||||
-rw-r--r-- | src/loom/std/mod.rs | 19 | ||||
-rw-r--r-- | src/loom/std/mutex.rs | 31 | ||||
-rw-r--r-- | src/loom/std/parking_lot.rs | 20 | ||||
-rw-r--r-- | src/loom/std/unsafe_cell.rs | 2 |
11 files changed, 97 insertions, 20 deletions
diff --git a/src/loom/mocked.rs b/src/loom/mocked.rs index 7891395..367d59b 100644 --- a/src/loom/mocked.rs +++ b/src/loom/mocked.rs @@ -1,5 +1,32 @@ pub(crate) use loom::*; +pub(crate) mod sync { + + pub(crate) use loom::sync::MutexGuard; + + #[derive(Debug)] + pub(crate) struct Mutex<T>(loom::sync::Mutex<T>); + + #[allow(dead_code)] + impl<T> Mutex<T> { + #[inline] + pub(crate) fn new(t: T) -> Mutex<T> { + Mutex(loom::sync::Mutex::new(t)) + } + + #[inline] + pub(crate) fn lock(&self) -> MutexGuard<'_, T> { + self.0.lock().unwrap() + } + + #[inline] + pub(crate) fn try_lock(&self) -> Option<MutexGuard<'_, T>> { + self.0.try_lock().ok() + } + } + pub(crate) use loom::sync::*; +} + pub(crate) mod rand { pub(crate) fn seed() -> u64 { 1 diff --git a/src/loom/mod.rs b/src/loom/mod.rs index 56a41f2..5957b53 100644 --- a/src/loom/mod.rs +++ b/src/loom/mod.rs @@ -1,6 +1,8 @@ //! This module abstracts over `loom` and `std::sync` depending on whether we //! are running tests or not. +#![allow(unused)] + #[cfg(not(all(test, loom)))] mod std; #[cfg(not(all(test, loom)))] diff --git a/src/loom/std/atomic_ptr.rs b/src/loom/std/atomic_ptr.rs index f7fd56c..236645f 100644 --- a/src/loom/std/atomic_ptr.rs +++ b/src/loom/std/atomic_ptr.rs @@ -1,5 +1,5 @@ use std::fmt; -use std::ops::Deref; +use std::ops::{Deref, DerefMut}; /// `AtomicPtr` providing an additional `load_unsync` function. pub(crate) struct AtomicPtr<T> { @@ -21,6 +21,12 @@ impl<T> Deref for AtomicPtr<T> { } } +impl<T> DerefMut for AtomicPtr<T> { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.inner + } +} + impl<T> fmt::Debug for AtomicPtr<T> { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { self.deref().fmt(fmt) diff --git a/src/loom/std/atomic_u16.rs b/src/loom/std/atomic_u16.rs index 7039097..c1c5312 100644 --- a/src/loom/std/atomic_u16.rs +++ b/src/loom/std/atomic_u16.rs @@ -11,7 +11,7 @@ unsafe impl Send for AtomicU16 {} unsafe impl Sync for AtomicU16 {} impl AtomicU16 { - pub(crate) fn new(val: u16) -> AtomicU16 { + pub(crate) const fn new(val: u16) -> AtomicU16 { let inner = UnsafeCell::new(std::sync::atomic::AtomicU16::new(val)); AtomicU16 { inner } } diff --git a/src/loom/std/atomic_u32.rs b/src/loom/std/atomic_u32.rs index 6f786c5..61f95fb 100644 --- a/src/loom/std/atomic_u32.rs +++ b/src/loom/std/atomic_u32.rs @@ -11,7 +11,7 @@ unsafe impl Send for AtomicU32 {} unsafe impl Sync for AtomicU32 {} impl AtomicU32 { - pub(crate) fn new(val: u32) -> AtomicU32 { + pub(crate) const fn new(val: u32) -> AtomicU32 { let inner = UnsafeCell::new(std::sync::atomic::AtomicU32::new(val)); AtomicU32 { inner } } diff --git a/src/loom/std/atomic_u8.rs b/src/loom/std/atomic_u8.rs index 4fcd0df..408aea3 100644 --- a/src/loom/std/atomic_u8.rs +++ b/src/loom/std/atomic_u8.rs @@ -11,7 +11,7 @@ unsafe impl Send for AtomicU8 {} unsafe impl Sync for AtomicU8 {} impl AtomicU8 { - pub(crate) fn new(val: u8) -> AtomicU8 { + pub(crate) const fn new(val: u8) -> AtomicU8 { let inner = UnsafeCell::new(std::sync::atomic::AtomicU8::new(val)); AtomicU8 { inner } } diff --git a/src/loom/std/atomic_usize.rs b/src/loom/std/atomic_usize.rs index 0fe998f..0d5f36e 100644 --- a/src/loom/std/atomic_usize.rs +++ b/src/loom/std/atomic_usize.rs @@ -11,7 +11,7 @@ unsafe impl Send for AtomicUsize {} unsafe impl Sync for AtomicUsize {} impl AtomicUsize { - pub(crate) fn new(val: usize) -> AtomicUsize { + pub(crate) const fn new(val: usize) -> AtomicUsize { let inner = UnsafeCell::new(std::sync::atomic::AtomicUsize::new(val)); AtomicUsize { inner } } diff --git a/src/loom/std/mod.rs b/src/loom/std/mod.rs index 60ee56a..9525286 100644 --- a/src/loom/std/mod.rs +++ b/src/loom/std/mod.rs @@ -6,6 +6,7 @@ mod atomic_u32; mod atomic_u64; mod atomic_u8; mod atomic_usize; +mod mutex; #[cfg(feature = "parking_lot")] mod parking_lot; mod unsafe_cell; @@ -14,7 +15,12 @@ pub(crate) mod cell { pub(crate) use super::unsafe_cell::UnsafeCell; } -#[cfg(any(feature = "sync", feature = "io-driver"))] +#[cfg(any( + feature = "net", + feature = "process", + feature = "signal", + feature = "sync", +))] pub(crate) mod future { pub(crate) use crate::sync::AtomicWaker; } @@ -55,9 +61,10 @@ pub(crate) mod sync { #[cfg(not(feature = "parking_lot"))] #[allow(unused_imports)] - pub(crate) use std::sync::{ - Condvar, Mutex, MutexGuard, RwLock, RwLockReadGuard, WaitTimeoutResult, - }; + pub(crate) use std::sync::{Condvar, MutexGuard, RwLock, RwLockReadGuard, WaitTimeoutResult}; + + #[cfg(not(feature = "parking_lot"))] + pub(crate) use crate::loom::std::mutex::Mutex; pub(crate) mod atomic { pub(crate) use crate::loom::std::atomic_ptr::AtomicPtr; @@ -72,12 +79,12 @@ pub(crate) mod sync { } pub(crate) mod sys { - #[cfg(feature = "rt-threaded")] + #[cfg(feature = "rt-multi-thread")] pub(crate) fn num_cpus() -> usize { usize::max(1, num_cpus::get()) } - #[cfg(not(feature = "rt-threaded"))] + #[cfg(not(feature = "rt-multi-thread"))] pub(crate) fn num_cpus() -> usize { 1 } diff --git a/src/loom/std/mutex.rs b/src/loom/std/mutex.rs new file mode 100644 index 0000000..bf14d62 --- /dev/null +++ b/src/loom/std/mutex.rs @@ -0,0 +1,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, + } + } +} diff --git a/src/loom/std/parking_lot.rs b/src/loom/std/parking_lot.rs index 25d94af..c03190f 100644 --- a/src/loom/std/parking_lot.rs +++ b/src/loom/std/parking_lot.rs @@ -3,7 +3,7 @@ //! //! This can be extended to additional types/methods as required. -use std::sync::{LockResult, TryLockError, TryLockResult}; +use std::sync::LockResult; use std::time::Duration; // Types that do not need wrapping @@ -27,16 +27,20 @@ impl<T> Mutex<T> { } #[inline] - pub(crate) fn lock(&self) -> LockResult<MutexGuard<'_, T>> { - Ok(self.0.lock()) + #[cfg(all(feature = "parking_lot", not(all(loom, test)),))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "parking_lot",))))] + pub(crate) const fn const_new(t: T) -> Mutex<T> { + Mutex(parking_lot::const_mutex(t)) } #[inline] - pub(crate) fn try_lock(&self) -> TryLockResult<MutexGuard<'_, T>> { - match self.0.try_lock() { - Some(guard) => Ok(guard), - None => Err(TryLockError::WouldBlock), - } + pub(crate) fn lock(&self) -> MutexGuard<'_, T> { + self.0.lock() + } + + #[inline] + pub(crate) fn try_lock(&self) -> Option<MutexGuard<'_, T>> { + self.0.try_lock() } // Note: Additional methods `is_poisoned` and `into_inner`, can be diff --git a/src/loom/std/unsafe_cell.rs b/src/loom/std/unsafe_cell.rs index f2b03d8..66c1d79 100644 --- a/src/loom/std/unsafe_cell.rs +++ b/src/loom/std/unsafe_cell.rs @@ -2,7 +2,7 @@ pub(crate) struct UnsafeCell<T>(std::cell::UnsafeCell<T>); impl<T> UnsafeCell<T> { - pub(crate) fn new(data: T) -> UnsafeCell<T> { + pub(crate) const fn new(data: T) -> UnsafeCell<T> { UnsafeCell(std::cell::UnsafeCell::new(data)) } |