Struct abi_stable::external_types::parking_lot::rw_lock::RRwLock
source · #[repr(C)]pub struct RRwLock<T> { /* private fields */ }
Expand description
A read-write lock that allows dynamic mutable/shared borrows of shared data.
RRwLock allows either multiple shared locks,or a single write lock.
Poisoning
As opposed to the standard library version of this type, this rwlock type does not use poisoning, simply unlocking the lock when a panic happens.
Example
use abi_stable::external_types::RRwLock;
static LOCK: RRwLock<usize> = RRwLock::new(0);
let guard = std::thread::spawn(|| {
for _ in 0..100 {
*LOCK.write() += 1;
}
});
for _ in 0..100 {
*LOCK.write() += 1;
}
guard.join().unwrap();
assert_eq!(*LOCK.read(), 200);
Implementations§
source§impl<T> RRwLock<T>
impl<T> RRwLock<T>
sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
Unwraps this lock into its wrapped data.
Example
use abi_stable::external_types::RRwLock;
let lock = RRwLock::new("hello".to_string());
assert_eq!(lock.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::RRwLock;
let mut lock = RRwLock::new("Hello".to_string());
lock.get_mut().push_str(", World!");
assert_eq!(lock.read().as_str(), "Hello, World!");
sourcepub fn read(&self) -> RReadGuard<'_, T>
pub fn read(&self) -> RReadGuard<'_, T>
Acquires a lock for reading,blocking the current thread until it can.
This function returns a read guard,which releases read access when it is dropped.
Trying to lock the rwlock for reading in the same thread that has write access to the same rwlock will cause a deadlock.
Example
use abi_stable::external_types::RRwLock;
static LOCK: RRwLock<usize> = RRwLock::new(0);
*LOCK.write() += 4;
let read_guard_a = LOCK.read();
let read_guard_b = LOCK.read();
assert_eq!(*read_guard_a, 4);
assert_eq!(*read_guard_b, 4);
sourcepub fn try_read(&self) -> ROption<RReadGuard<'_, T>>
pub fn try_read(&self) -> ROption<RReadGuard<'_, T>>
Attemps to acquire a lock for reading,failing if it is locked for writing.
Returns the read guard if the rwlock can be immediately acquired,otherwise returns RNone.
Example
use abi_stable::external_types::RRwLock;
static LOCK: RRwLock<usize> = RRwLock::new(0);
let mut write_guard = LOCK.write();
assert!(LOCK.try_read().is_none());
*write_guard += 4;
drop(write_guard);
assert_eq!(*LOCK.try_read().unwrap(), 4);
sourcepub fn try_read_for(&self, timeout: RDuration) -> ROption<RReadGuard<'_, T>>
pub fn try_read_for(&self, timeout: RDuration) -> ROption<RReadGuard<'_, T>>
Attempts to acquire a lock for reading,for the timeout duration.
Once the timeout is reached,this will return None, otherwise it will return the read guard.
Example
use abi_stable::{external_types::RRwLock, std_types::RDuration};
static LOCK: RRwLock<usize> = RRwLock::new(0);
static DUR: RDuration = RDuration::from_millis(1);
let mut write_guard = LOCK.write();
assert!(LOCK.try_read_for(DUR).is_none());
*write_guard += 7;
drop(write_guard);
assert_eq!(*LOCK.try_read_for(DUR).unwrap(), 7);
sourcepub fn write(&self) -> RWriteGuard<'_, T>
pub fn write(&self) -> RWriteGuard<'_, T>
Acquires a lock for writing,blocking the current thread until it can.
This function returns a write guard,which releases write access when it is dropped.
Trying to lock the rwlock in the same thread that has read or write access to the same rwlock will cause a deadlock.
Example
use abi_stable::external_types::RRwLock;
let lock = RRwLock::new(0);
let mut guard = lock.write();
*guard += 4;
assert_eq!(*guard, 4);
sourcepub fn try_write(&self) -> ROption<RWriteGuard<'_, T>>
pub fn try_write(&self) -> ROption<RWriteGuard<'_, T>>
Attemps to acquire a lock for writing.
Returns the write guard if the rwlock can be immediately acquired,otherwise returns RNone.
Example
use abi_stable::external_types::RRwLock;
let lock = RRwLock::new(0);
let mut guard = lock.write();
assert!(lock.try_write().is_none());
*guard += 4;
assert_eq!(*guard, 4);
sourcepub fn try_write_for(&self, timeout: RDuration) -> ROption<RWriteGuard<'_, T>>
pub fn try_write_for(&self, timeout: RDuration) -> ROption<RWriteGuard<'_, T>>
Attempts to acquire a lock for writing,for the timeout duration.
Once the timeout is reached,this will return None, otherwise it will return the write guard.
Example
use abi_stable::{external_types::RRwLock, std_types::RDuration};
static DUR: RDuration = RDuration::from_millis(1);
let lock = RRwLock::new(0);
let mut write_guard = lock.try_write_for(DUR).unwrap();
*write_guard += 4;
assert!(lock.try_write_for(DUR).is_none());
assert_eq!(*write_guard, 4);
Trait Implementations§
source§impl<T> GetStaticEquivalent_ for RRwLock<T>where
T: __StableAbi,
impl<T> GetStaticEquivalent_ for RRwLock<T>where
T: __StableAbi,
§type StaticEquivalent = _static_RRwLock<<T as GetStaticEquivalent_>::StaticEquivalent>
type StaticEquivalent = _static_RRwLock<<T as GetStaticEquivalent_>::StaticEquivalent>
'static
equivalent of Self
source§impl<T> StableAbi for RRwLock<T>where
T: __StableAbi,
impl<T> StableAbi for RRwLock<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 RRwLock<T>
impl<T: Send + Sync> Sync for RRwLock<T>
Auto Trait Implementations§
impl<T> !RefUnwindSafe for RRwLock<T>
impl<T> Unpin for RRwLock<T>where
T: Unpin,
impl<T> UnwindSafe for RRwLock<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