[][src]Struct abi_stable::external_types::parking_lot::rw_lock::RRwLock

#[repr(C)]pub struct RRwLock<T> { /* fields omitted */ }

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

impl<T> RRwLock<T>[src]

pub const fn new(value: T) -> Self[src]

Constructs a lock,wrapping value.

Example

use abi_stable::external_types::RRwLock;

static LOCK:RRwLock<Option<String>>=RRwLock::new(None);
 
let lock=RRwLock::new(0);

pub fn into_inner(self) -> T[src]

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");

pub fn get_mut(&mut self) -> &mut T[src]

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!");

pub fn read(&self) -> RReadGuard<'_, T>[src]

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);

pub fn try_read(&self) -> ROption<RReadGuard<'_, T>>[src]

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);

pub fn try_read_for(&self, timeout: RDuration) -> ROption<RReadGuard<'_, T>>[src]

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);

pub fn write(&self) -> RWriteGuard<'_, T>[src]

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);

pub fn try_write(&self) -> ROption<RWriteGuard<'_, T>>[src]

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);

pub fn try_write_for(&self, timeout: RDuration) -> ROption<RWriteGuard<'_, T>>[src]

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

impl<T> GetStaticEquivalent_ for RRwLock<T> where
    T: __StableAbi
[src]

type StaticEquivalent = _static_RRwLock<__GetStaticEquivalent<T>>

impl<T: Send> Send for RRwLock<T> where
    RawRwLock: Send
[src]

impl<T> StableAbi for RRwLock<T> where
    T: __StableAbi
[src]

type IsNonZeroType = False

Whether this type has a single invalid bit-pattern. Read more

impl<T: Send + Sync> Sync for RRwLock<T> where
    RawRwLock: Sync
[src]

Auto Trait Implementations

impl<T> !RefUnwindSafe for RRwLock<T>[src]

impl<T> Unpin for RRwLock<T> where
    T: Unpin
[src]

impl<T> UnwindSafe for RRwLock<T> where
    T: UnwindSafe
[src]

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T> GetWithMetadata for T[src]

type ForSelf = WithMetadata_<T, T>

This is always WithMetadata_<Self, Self>

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> SelfOps for T where
    T: ?Sized
[src]

impl<This> TransmuteElement for This where
    This: ?Sized
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The error type returned when the conversion fails.

impl<T> TypeIdentity for T where
    T: ?Sized
[src]

type Type = T

The same type as Self. Read more