Struct RwLockMappedWriteGuard

pub struct RwLockMappedWriteGuard<'a, T: ?Sized> { /* private fields */ }

RAII structure used to release the exclusive write access of a lock when dropped.

This structure is created by mapping an RwLockWriteGuard. It is a separate type from RwLockWriteGuard to disallow downgrading a mapped guard, since doing so can cause undefined behavior.

Implementations

impl<'a, T: ?Sized> RwLockMappedWriteGuard<'a, T>

fn map<F, U: ?Sized>(this: Self, f: F) -> RwLockMappedWriteGuard<'a, U>
where
    F: FnOnce(&mut T) -> &mut U,

Makes a new RwLockMappedWriteGuard for a component of the locked data.

This operation cannot fail as the RwLockMappedWriteGuard passed in already locked the data.

This is an associated function that needs to be used as RwLockMappedWriteGuard::map(..). A method would interfere with methods of the same name on the contents of the locked data.

This is an asynchronous version of RwLockWriteGuard::map from the parking_lot crate.

Examples

use tokio::sync::{RwLock, RwLockWriteGuard};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Foo(u32);

# #[tokio::main(flavor = "current_thread")]
# async fn main() {
let lock = RwLock::new(Foo(1));

{
    let mut mapped = RwLockWriteGuard::map(lock.write().await, |f| &mut f.0);
    *mapped = 2;
}

assert_eq!(Foo(2), *lock.read().await);
# }
fn try_map<F, U: ?Sized>(this: Self, f: F) -> Result<RwLockMappedWriteGuard<'a, U>, Self>
where
    F: FnOnce(&mut T) -> Option<&mut U>,

Attempts to make a new RwLockMappedWriteGuard for a component of the locked data. The original guard is returned if the closure returns None.

This operation cannot fail as the RwLockMappedWriteGuard passed in already locked the data.

This is an associated function that needs to be used as RwLockMappedWriteGuard::try_map(...). A method would interfere with methods of the same name on the contents of the locked data.

This is an asynchronous version of RwLockWriteGuard::try_map from the parking_lot crate.

Examples

use tokio::sync::{RwLock, RwLockWriteGuard};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Foo(u32);

# #[tokio::main(flavor = "current_thread")]
# async fn main() {
let lock = RwLock::new(Foo(1));

{
    let guard = lock.write().await;
    let mut guard = RwLockWriteGuard::try_map(guard, |f| Some(&mut f.0)).expect("should not fail");
    *guard = 2;
}

assert_eq!(Foo(2), *lock.read().await);
# }

Trait Implementations

impl<'a, T> Debug for RwLockMappedWriteGuard<'a, T> where T: Debug + ?Sized,

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

impl<'a, T> Display for RwLockMappedWriteGuard<'a, T> where T: Display + ?Sized,

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

impl<'a, T: ?Sized> Drop for RwLockMappedWriteGuard<'a, T>

fn drop(&mut self)

impl<T> Send for RwLockMappedWriteGuard<'_, T> where T: ?Sized + Send + Sync,

impl<T> Sync for RwLockMappedWriteGuard<'_, T> where T: ?Sized + Send + Sync,

impl<T: ?Sized> Deref for RwLockMappedWriteGuard<'_, T>

type Target = T;
fn deref(&self) -> &T

impl<T: ?Sized> DerefMut for RwLockMappedWriteGuard<'_, T>

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

Auto Trait Implementations

impl<'a, T> !RefUnwindSafe for RwLockMappedWriteGuard<'a, T>

impl<'a, T> !UnwindSafe for RwLockMappedWriteGuard<'a, T>

impl<'a, T> Freeze for RwLockMappedWriteGuard<'a, T> where *mut T: Freeze, PhantomData<&'a mut T>: Freeze, T: ?Sized,

impl<'a, T> Unpin for RwLockMappedWriteGuard<'a, T> where *mut T: Unpin, PhantomData<&'a mut T>: Unpin, T: ?Sized,

impl<'a, T> UnsafeUnpin for RwLockMappedWriteGuard<'a, T> where *mut T: UnsafeUnpin, PhantomData<&'a mut T>: UnsafeUnpin, T: ?Sized,

Blanket Implementations

impl<P, T> Receiver for RwLockMappedWriteGuard<'a, T> where P: Deref<Target = T> + ?Sized, T: ?Sized,

type Target = T;

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

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for RwLockMappedWriteGuard<'a, T> where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for RwLockMappedWriteGuard<'a, T> where T: ?Sized,

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

impl<T> From<T> for RwLockMappedWriteGuard<'a, T>

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> ToString for RwLockMappedWriteGuard<'a, T> where T: Display + ?Sized,

fn to_string(&self) -> String

impl<T, U> Into<U> for RwLockMappedWriteGuard<'a, T> where U: From<T>,

fn into(self) -> U

Calls U::from(self).

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

impl<T, U> TryFrom<U> for RwLockMappedWriteGuard<'a, T> where U: Into<T>,

type Error = never;
fn try_from(value: U) -> Result<T, never>

impl<T, U> TryInto<U> for RwLockMappedWriteGuard<'a, T> where U: TryFrom<T>,

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