Struct OwnedRwLockReadGuard

pub struct OwnedRwLockReadGuard<T: ?Sized, U: ?Sized = T> { /* private fields */ }

Owned RAII structure used to release the shared read access of a lock when dropped.

This structure is created by the read_owned method on RwLock.

Implementations

impl<T: ?Sized, U: ?Sized> OwnedRwLockReadGuard<T, U>

fn map<F, V: ?Sized>(this: Self, f: F) -> OwnedRwLockReadGuard<T, V>
where
    F: FnOnce(&U) -> &V,

Makes a new OwnedRwLockReadGuard for a component of the locked data. This operation cannot fail as the OwnedRwLockReadGuard passed in already locked the data.

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

Examples

use std::sync::Arc;
use tokio::sync::{RwLock, OwnedRwLockReadGuard};

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

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

let guard = lock.read_owned().await;
let guard = OwnedRwLockReadGuard::map(guard, |f| &f.0);

assert_eq!(1, *guard);
# }
fn try_map<F, V: ?Sized>(this: Self, f: F) -> Result<OwnedRwLockReadGuard<T, V>, Self>
where
    F: FnOnce(&U) -> Option<&V>,

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

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

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

Examples

use std::sync::Arc;
use tokio::sync::{RwLock, OwnedRwLockReadGuard};

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

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

let guard = lock.read_owned().await;
let guard = OwnedRwLockReadGuard::try_map(guard, |f| Some(&f.0)).expect("should not fail");

assert_eq!(1, *guard);
# }
fn rwlock(this: &Self) -> &Arc<RwLock<T>>

Returns a reference to the original Arc<RwLock>.

Examples

use std::sync::Arc;
use tokio::sync::{RwLock, OwnedRwLockReadGuard};

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

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

let guard = lock.clone().read_owned().await;
assert!(Arc::ptr_eq(&lock, OwnedRwLockReadGuard::rwlock(&guard)));

let guard = OwnedRwLockReadGuard::map(guard, |f| &f.0);
assert!(Arc::ptr_eq(&lock, OwnedRwLockReadGuard::rwlock(&guard)));
# }

Trait Implementations

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

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

impl<T: ?Sized, U> Debug for OwnedRwLockReadGuard<T, U> where U: Debug + ?Sized,

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

impl<T: ?Sized, U> Display for OwnedRwLockReadGuard<T, U> where U: Display + ?Sized,

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

impl<T: ?Sized, U: ?Sized> Deref for OwnedRwLockReadGuard<T, U>

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

impl<T: ?Sized, U: ?Sized> Drop for OwnedRwLockReadGuard<T, U>

fn drop(&mut self)

Auto Trait Implementations

impl<T, U = T> !RefUnwindSafe for OwnedRwLockReadGuard<T, U>

impl<T, U = T> !UnwindSafe for OwnedRwLockReadGuard<T, U>

impl<T, U> Freeze for OwnedRwLockReadGuard<T, U> where Arc<RwLock<T>>: Freeze, *const U: Freeze, PhantomData<T>: Freeze, T: ?Sized, U: ?Sized,

impl<T, U> Unpin for OwnedRwLockReadGuard<T, U> where Arc<RwLock<T>>: Unpin, *const U: Unpin, PhantomData<T>: Unpin, T: ?Sized, U: ?Sized,

impl<T, U> UnsafeUnpin for OwnedRwLockReadGuard<T, U> where Arc<RwLock<T>>: UnsafeUnpin, *const U: UnsafeUnpin, PhantomData<T>: UnsafeUnpin, T: ?Sized, U: ?Sized,

Blanket Implementations

impl<P, T> Receiver for OwnedRwLockReadGuard<T, U> where P: Deref<Target = T> + ?Sized, T: ?Sized,

type Target = T;

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

fn type_id(&self) -> TypeId

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

fn borrow(&self) -> &T

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

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

impl<T> From<T> for OwnedRwLockReadGuard<T, U>

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> ToString for OwnedRwLockReadGuard<T, U> where T: Display + ?Sized,

fn to_string(&self) -> String

impl<T, U> Into<U> for OwnedRwLockReadGuard<T, U> 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 OwnedRwLockReadGuard<T, U> where U: Into<T>,

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

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

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