OrderedRwLock

Struct OrderedRwLock 

Source
pub struct OrderedRwLock<T: ?Sized> { /* private fields */ }
Expand description

The Ordered RW Lock will be locking all reads, which starting after write and unlocking them only when write will realize. It may be slow down the reads speed, but decrease time to write on systems, where it is critical.

BUT RW Lock has some limitations. You should avoid acquiring the second reading before realizing first inside the one future. Because it can happen that between your readings a write from another thread will acquire the mutex, and you will get a deadlock.

Implementations§

Source§

impl<T> OrderedRwLock<T>

Source

pub const fn new(data: T) -> OrderedRwLock<T>

Create a new OrderedRWLock

Source§

impl<T: ?Sized> OrderedRwLock<T>

Source

pub fn write(&self) -> OrderedRwLockWriteGuardFuture<'_, T>

Acquires the mutex for are write.

Returns a guard that releases the mutex and wake the next locker when it will be dropped.

§Examples
use fast_async_mutex::rwlock_ordered::OrderedRwLock;

#[tokio::main]
async fn main() {
    let mutex = OrderedRwLock::new(10);
    let mut guard = mutex.write().await;
    *guard += 1;
    assert_eq!(*guard, 11);
}
Source

pub fn write_owned(self: &Arc<Self>) -> OrderedRwLockWriteOwnedGuardFuture<T>

Acquires the mutex for are write.

Returns a guard that releases the mutex and wake the next locker when it will be dropped. WriteLockOwnedGuard have a 'static lifetime, but requires the Arc<RWLock<T>> type

§Examples
use fast_async_mutex::rwlock_ordered::OrderedRwLock;
use std::sync::Arc;
#[tokio::main]
async fn main() {
    let mutex = Arc::new(OrderedRwLock::new(10));
    let mut guard = mutex.write_owned().await;
    *guard += 1;
    assert_eq!(*guard, 11);
}
Source

pub fn read(&self) -> OrderedRwLockReadGuardFuture<'_, T>

Acquires the mutex for are read.

Returns a guard that releases the mutex and wake the next locker when it will be dropped.

§Examples
use fast_async_mutex::rwlock_ordered::OrderedRwLock;

#[tokio::main]
async fn main() {
    let mutex = OrderedRwLock::new(10);
    let guard = mutex.read().await;
    let guard2 = mutex.read().await;
    assert_eq!(*guard, *guard2);
}
Source

pub fn read_owned(self: &Arc<Self>) -> OrderedRwLockReadOwnedGuardFuture<T>

Acquires the mutex for are write.

Returns a guard that releases the mutex and wake the next locker when it will be dropped. WriteLockOwnedGuard have a 'static lifetime, but requires the Arc<RWLock<T>> type

§Examples
use fast_async_mutex::rwlock_ordered::OrderedRwLock;
use std::sync::Arc;
#[tokio::main]
async fn main() {
    let mutex = Arc::new(OrderedRwLock::new(10));
    let guard = mutex.read().await;
    let guard2 = mutex.read().await;
    assert_eq!(*guard, *guard2);
}
Source

pub fn try_acquire_reader(&self, id: usize) -> bool

Trait Implementations§

Source§

impl<T: Debug + ?Sized> Debug for OrderedRwLock<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T> Send for OrderedRwLock<T>
where T: Send + ?Sized,

Source§

impl<T> Sync for OrderedRwLock<T>
where T: Send + Sync + ?Sized,

Auto Trait Implementations§

§

impl<T> !Freeze for OrderedRwLock<T>

§

impl<T> !RefUnwindSafe for OrderedRwLock<T>

§

impl<T> Unpin for OrderedRwLock<T>
where T: Unpin + ?Sized,

§

impl<T> UnwindSafe for OrderedRwLock<T>
where T: UnwindSafe + ?Sized,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.