Struct abi_stable::external_types::parking_lot::mutex::RMutex
source · #[repr(C)]pub struct RMutex<T> { /* private fields */ }
Expand description
A mutual exclusion lock that allows dynamic mutable borrows of shared data.
Poisoning
As opposed to the standard library version of this type, this mutex type does not use poisoning, simply unlocking the lock when a panic happens.
Example
use abi_stable::external_types::RMutex;
static MUTEX: RMutex<usize> = RMutex::new(0);
let guard = std::thread::spawn(|| {
for _ in 0..100 {
*MUTEX.lock() += 1;
}
});
for _ in 0..100 {
*MUTEX.lock() += 1;
}
guard.join().unwrap();
assert_eq!(*MUTEX.lock(), 200);
Implementations§
source§impl<T> RMutex<T>
impl<T> RMutex<T>
sourcepub const fn new(value: T) -> Self
pub const fn new(value: T) -> Self
Constructs a mutex,wrapping value
.
Example
use abi_stable::external_types::RMutex;
static MUTEX: RMutex<Option<String>> = RMutex::new(None);
let mutex = RMutex::new(0);
sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
Unwraps this mutex into its wrapped data.
Example
use abi_stable::external_types::RMutex;
let mutex = RMutex::new("hello".to_string());
assert_eq!(mutex.into_inner().as_str(), "hello");
sourcepub fn get_mut(&mut self) -> &mut T
pub fn get_mut(&mut self) -> &mut T
Gets a mutable reference to its wrapped data.
This does not require any locking,since it takes self
mutably.
Example
use abi_stable::external_types::RMutex;
let mut mutex = RMutex::new("Hello".to_string());
mutex.get_mut().push_str(", World!");
assert_eq!(mutex.lock().as_str(), "Hello, World!");
sourcepub fn lock(&self) -> RMutexGuard<'_, T>
pub fn lock(&self) -> RMutexGuard<'_, T>
Acquires a mutex,blocking the current thread until it can.
This function returns a guard which releases the mutex when it is dropped.
Trying to lock the mutex in the same thread that holds the lock will cause a deadlock.
Example
use abi_stable::external_types::RMutex;
static MUTEX: RMutex<usize> = RMutex::new(0);
let guard = std::thread::spawn(|| *MUTEX.lock() += 1);
*MUTEX.lock() += 4;
guard.join().unwrap();
assert_eq!(*MUTEX.lock(), 5);
sourcepub fn try_lock(&self) -> ROption<RMutexGuard<'_, T>>
pub fn try_lock(&self) -> ROption<RMutexGuard<'_, T>>
Attemps to acquire a mutex guard.
Returns the mutex guard if the mutex can be immediately acquired,
otherwise returns RNone
.
Example
use abi_stable::external_types::RMutex;
static MUTEX: RMutex<usize> = RMutex::new(0);
let mut guard = MUTEX.try_lock().unwrap();
assert!(MUTEX.try_lock().is_none());
assert_eq!(*guard, 0);
sourcepub fn try_lock_for(&self, timeout: RDuration) -> ROption<RMutexGuard<'_, T>>
pub fn try_lock_for(&self, timeout: RDuration) -> ROption<RMutexGuard<'_, T>>
Attempts to acquire a mutex guard for the timeout
duration.
Once the timeout is reached,this will return RNone
,
otherwise it will return the mutex guard.
Example
use abi_stable::{external_types::RMutex, std_types::RDuration};
static MUTEX: RMutex<usize> = RMutex::new(0);
static DUR: RDuration = RDuration::from_millis(4);
let mut guard = MUTEX.try_lock_for(DUR).unwrap();
assert!(MUTEX.try_lock_for(DUR).is_none());
assert_eq!(*guard, 0);
Trait Implementations§
source§impl<T> GetStaticEquivalent_ for RMutex<T>where
T: __StableAbi,
impl<T> GetStaticEquivalent_ for RMutex<T>where
T: __StableAbi,
§type StaticEquivalent = _static_RMutex<<T as GetStaticEquivalent_>::StaticEquivalent>
type StaticEquivalent = _static_RMutex<<T as GetStaticEquivalent_>::StaticEquivalent>
'static
equivalent of Self
source§impl<T> StableAbi for RMutex<T>where
T: __StableAbi,
impl<T> StableAbi for RMutex<T>where
T: __StableAbi,
§type IsNonZeroType = False
type IsNonZeroType = False
source§const LAYOUT: &'static TypeLayout = _
const LAYOUT: &'static TypeLayout = _
source§const ABI_CONSTS: AbiConsts = _
const ABI_CONSTS: AbiConsts = _
const
-equivalents of the associated types.impl<T: Send> Send for RMutex<T>
impl<T: Send> Sync for RMutex<T>
Auto Trait Implementations§
impl<T> !RefUnwindSafe for RMutex<T>
impl<T> Unpin for RMutex<T>where
T: Unpin,
impl<T> UnwindSafe for RMutex<T>where
T: UnwindSafe,
Blanket Implementations§
source§impl<T> AlignerFor<1> for T
impl<T> AlignerFor<1> for T
source§impl<T> AlignerFor<1024> for T
impl<T> AlignerFor<1024> for T
§type Aligner = AlignTo1024<T>
type Aligner = AlignTo1024<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<128> for T
impl<T> AlignerFor<128> for T
§type Aligner = AlignTo128<T>
type Aligner = AlignTo128<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<16> for T
impl<T> AlignerFor<16> for T
source§impl<T> AlignerFor<16384> for T
impl<T> AlignerFor<16384> for T
§type Aligner = AlignTo16384<T>
type Aligner = AlignTo16384<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<2> for T
impl<T> AlignerFor<2> for T
source§impl<T> AlignerFor<2048> for T
impl<T> AlignerFor<2048> for T
§type Aligner = AlignTo2048<T>
type Aligner = AlignTo2048<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<256> for T
impl<T> AlignerFor<256> for T
§type Aligner = AlignTo256<T>
type Aligner = AlignTo256<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<32> for T
impl<T> AlignerFor<32> for T
source§impl<T> AlignerFor<32768> for T
impl<T> AlignerFor<32768> for T
§type Aligner = AlignTo32768<T>
type Aligner = AlignTo32768<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<4> for T
impl<T> AlignerFor<4> for T
source§impl<T> AlignerFor<4096> for T
impl<T> AlignerFor<4096> for T
§type Aligner = AlignTo4096<T>
type Aligner = AlignTo4096<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<512> for T
impl<T> AlignerFor<512> for T
§type Aligner = AlignTo512<T>
type Aligner = AlignTo512<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<64> for T
impl<T> AlignerFor<64> for T
source§impl<T> AlignerFor<8> for T
impl<T> AlignerFor<8> for T
source§impl<T> AlignerFor<8192> for T
impl<T> AlignerFor<8192> for T
§type Aligner = AlignTo8192<T>
type Aligner = AlignTo8192<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<S> ROExtAcc for S
impl<S> ROExtAcc for S
source§fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F
fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F
offset
. Read moresource§fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F
fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F
offset
. Read moresource§fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F
fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F
offset
. Read moresource§fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F
fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F
offset
. Read moresource§impl<S> ROExtOps<Aligned> for S
impl<S> ROExtOps<Aligned> for S
source§fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Aligned>, value: F) -> F
fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Aligned>, value: F) -> F
offset
) with value
,
returning the previous value of the field. Read moresource§fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> Fwhere
F: Copy,
fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> Fwhere
F: Copy,
source§impl<S> ROExtOps<Unaligned> for S
impl<S> ROExtOps<Unaligned> for S
source§fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, value: F) -> F
fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, value: F) -> F
offset
) with value
,
returning the previous value of the field. Read moresource§fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> Fwhere
F: Copy,
fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> Fwhere
F: Copy,
source§impl<T> SelfOps for Twhere
T: ?Sized,
impl<T> SelfOps for Twhere
T: ?Sized,
source§fn piped<F, U>(self, f: F) -> U
fn piped<F, U>(self, f: F) -> U
source§fn piped_ref<'a, F, U>(&'a self, f: F) -> U
fn piped_ref<'a, F, U>(&'a self, f: F) -> U
piped
except that the function takes &Self
Useful for functions that take &Self
instead of Self
. Read moresource§fn piped_mut<'a, F, U>(&'a mut self, f: F) -> Uwhere
F: FnOnce(&'a mut Self) -> U,
fn piped_mut<'a, F, U>(&'a mut self, f: F) -> Uwhere
F: FnOnce(&'a mut Self) -> U,
piped
, except that the function takes &mut Self
.
Useful for functions that take &mut Self
instead of Self
.source§fn mutated<F>(self, f: F) -> Self
fn mutated<F>(self, f: F) -> Self
source§fn observe<F>(self, f: F) -> Self
fn observe<F>(self, f: F) -> Self
source§fn as_ref_<T>(&self) -> &T
fn as_ref_<T>(&self) -> &T
AsRef
,
using the turbofish .as_ref_::<_>()
syntax. Read more