Skip to main content

OwnedMutexGuard

Struct OwnedMutexGuard 

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

An owned handle to a held Mutex.

This guard is only available from a Mutex that is wrapped in an Arc. It is identical to MutexGuard, except that rather than borrowing the Mutex, it clones the Arc, incrementing the reference count. This means that unlike MutexGuard, it will have the 'static lifetime.

As long as you have this guard, you have exclusive access to the underlying T. The guard internally keeps a reference-counted pointer to the original Mutex, so even if the lock goes away, the guard remains valid.

The lock is automatically released whenever the guard is dropped, at which point lock will succeed yet again.

Implementations§

Source§

impl<T> OwnedMutexGuard<T>
where T: ?Sized,

Source

pub fn map<U, F>(this: OwnedMutexGuard<T>, f: F) -> OwnedMappedMutexGuard<T, U>
where F: FnOnce(&mut T) -> &mut U, U: ?Sized,

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

This operation cannot fail as the OwnedMutexGuard passed in already locked the mutex.

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

§Examples
use tokio::sync::{Mutex, OwnedMutexGuard};
use std::sync::Arc;

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

let foo = Arc::new(Mutex::new(Foo(1)));

{
    let mut mapped = OwnedMutexGuard::map(foo.clone().lock_owned().await, |f| &mut f.0);
    *mapped = 2;
}

assert_eq!(Foo(2), *foo.lock().await);
Source

pub fn try_map<U, F>( this: OwnedMutexGuard<T>, f: F, ) -> Result<OwnedMappedMutexGuard<T, U>, OwnedMutexGuard<T>>
where F: FnOnce(&mut T) -> Option<&mut U>, U: ?Sized,

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

This operation cannot fail as the OwnedMutexGuard passed in already locked the mutex.

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

§Examples
use tokio::sync::{Mutex, OwnedMutexGuard};
use std::sync::Arc;

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

let foo = Arc::new(Mutex::new(Foo(1)));

{
    let mut mapped = OwnedMutexGuard::try_map(foo.clone().lock_owned().await, |f| Some(&mut f.0))
        .expect("should not fail");
    *mapped = 2;
}

assert_eq!(Foo(2), *foo.lock().await);
Source

pub fn mutex(this: &OwnedMutexGuard<T>) -> &Arc<Mutex<T>> ⓘ

Returns a reference to the original Arc<Mutex>.

use std::sync::Arc;
use tokio::sync::{Mutex, OwnedMutexGuard};

async fn unlock_and_relock(guard: OwnedMutexGuard<u32>) -> OwnedMutexGuard<u32> {
    println!("1. contains: {:?}", *guard);
    let mutex: Arc<Mutex<u32>> = OwnedMutexGuard::mutex(&guard).clone();
    drop(guard);
    let guard = mutex.lock_owned().await;
    println!("2. contains: {:?}", *guard);
    guard
}

Trait Implementations§

Source§

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

Source§

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

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

impl<T> Deref for OwnedMutexGuard<T>
where T: ?Sized,

Source§

type Target = T

The resulting type after dereferencing.
Source§

fn deref(&self) -> &<OwnedMutexGuard<T> as Deref>::Target

Dereferences the value.
Source§

impl<T> DerefMut for OwnedMutexGuard<T>
where T: ?Sized,

Source§

fn deref_mut(&mut self) -> &mut <OwnedMutexGuard<T> as Deref>::Target

Mutably dereferences the value.
Source§

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

Source§

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

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

impl<T> Drop for OwnedMutexGuard<T>
where T: ?Sized,

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more
Source§

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

Auto Trait Implementations§

§

impl<T> !RefUnwindSafe for OwnedMutexGuard<T>

§

impl<T> !UnwindSafe for OwnedMutexGuard<T>

§

impl<T> Freeze for OwnedMutexGuard<T>
where Arc<Mutex<T>>: Freeze, T: ?Sized,

§

impl<T> Send for OwnedMutexGuard<T>
where Arc<Mutex<T>>: Send, T: ?Sized,

§

impl<T> Unpin for OwnedMutexGuard<T>
where Arc<Mutex<T>>: Unpin, T: ?Sized,

§

impl<T> UnsafeUnpin for OwnedMutexGuard<T>
where Arc<Mutex<T>>: UnsafeUnpin, T: ?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> AnySend for T
where T: Any + Send,

Source§

impl<T> AnySendSync for T
where T: Any + Send + Sync,

Source§

impl<T> AnySync for T
where T: Any + Sync,

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<R> CryptoRng for R
where R: TryCryptoRng<Error = !> + ?Sized,

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<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<R> Rng for R
where R: TryRng<Error = !> + ?Sized,

Source§

fn next_u32(&mut self) -> u32

Return the next random u32.
Source§

fn next_u64(&mut self) -> u64

Return the next random u64.
Source§

fn fill_bytes(&mut self, dst: &mut [u8])

Fill dest with random data. Read more
Source§

impl<R> RngCore for R
where R: Rng,

Source§

impl<R> RngExt for R
where R: Rng + ?Sized,

Source§

fn random<T>(&mut self) -> T

Return a random value via the StandardUniform distribution. Read more
Source§

fn random_iter<T>(self) -> Iter<StandardUniform, Self, T> ⓘ

Return an iterator over random variates Read more
Source§

fn random_range<T, R>(&mut self, range: R) -> T
where T: SampleUniform, R: SampleRange<T>,

Generate a random value in the given range. Read more
Source§

fn random_bool(&mut self, p: f64) -> bool

Return a bool with a probability p of being true. Read more
Source§

fn random_ratio(&mut self, numerator: u32, denominator: u32) -> bool

Return a bool with a probability of numerator/denominator of being true. Read more
Source§

fn sample<T, D>(&mut self, distr: D) -> T
where D: Distribution<T>,

Sample a new value, using the given distribution. Read more
Source§

fn sample_iter<T, D>(self, distr: D) -> Iter<D, Self, T> ⓘ
where D: Distribution<T>, Self: Sized,

Create an iterator that generates values using the given distribution. Read more
Source§

fn fill<T>(&mut self, dest: &mut [T])
where T: Fill,

Fill any type implementing Fill with random data Read more
Source§

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

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<R> TryCryptoRng for R
where R: DerefMut, <R as Deref>::Target: TryCryptoRng,

Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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.
Source§

impl<R> TryRng for R
where R: DerefMut, <R as Deref>::Target: TryRng,

Source§

type Error = <<R as Deref>::Target as TryRng>::Error

The type returned in the event of a RNG error. Read more
Source§

fn try_next_u32(&mut self) -> Result<u32, <R as TryRng>::Error>

Return the next random u32.
Source§

fn try_next_u64(&mut self) -> Result<u64, <R as TryRng>::Error>

Return the next random u64.
Source§

fn try_fill_bytes(&mut self, dst: &mut [u8]) -> Result<(), <R as TryRng>::Error>

Fill dst entirely with random data.
Source§

impl<R> TryRngCore for R
where R: TryRng,

Source§

type Error = <R as TryRng>::Error

👎Deprecated since 0.10.0:

use TryRng instead

Error type.