Struct MutexGuard

struct MutexGuard<'a, T: ?Sized> { ... }

A handle to a held Mutex. The guard can be held across any .await point as it is Send.

As long as you have this guard, you have exclusive access to the underlying T. The guard internally borrows the Mutex, so the mutex will not be dropped while a guard exists.

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

Implementations

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

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

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

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

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

Examples

use tokio::sync::{Mutex, MutexGuard};

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

# #[tokio::main]
# async fn main() {
let foo = Mutex::new(Foo(1));

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

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

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

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

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

Examples

use tokio::sync::{Mutex, MutexGuard};

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

# #[tokio::main]
# async fn main() {
let foo = Mutex::new(Foo(1));

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

assert_eq!(Foo(2), *foo.lock().await);
# }
fn mutex(this: &Self) -> &'a Mutex<T>

Returns a reference to the original Mutex.

use tokio::sync::{Mutex, MutexGuard};

async fn unlock_and_relock<'l>(guard: MutexGuard<'l, u32>) -> MutexGuard<'l, u32> {
    println!("1. contains: {:?}", *guard);
    let mutex = MutexGuard::mutex(&guard);
    drop(guard);
    let guard = mutex.lock().await;
    println!("2. contains: {:?}", *guard);
    guard
}
#
# #[tokio::main]
# async fn main() {
#     let mutex = Mutex::new(0u32);
#     let guard = mutex.lock().await;
#     let _guard = unlock_and_relock(guard).await;
# }

impl<'a, T> Freeze for MutexGuard<'a, T>

impl<'a, T> RefUnwindSafe for MutexGuard<'a, T>

impl<'a, T> Send for MutexGuard<'a, T>

impl<'a, T> Unpin for MutexGuard<'a, T>

impl<'a, T> UnsafeUnpin for MutexGuard<'a, T>

impl<'a, T> UnwindSafe for MutexGuard<'a, T>

impl<P, T> Receiver for MutexGuard<'a, T>

impl<T> Any for MutexGuard<'a, T>

fn type_id(self: &Self) -> TypeId

impl<T> Borrow for MutexGuard<'a, T>

fn borrow(self: &Self) -> &T

impl<T> BorrowMut for MutexGuard<'a, T>

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

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

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> Sync for MutexGuard<'_, T>

impl<T> ToString for MutexGuard<'a, T>

fn to_string(self: &Self) -> String

impl<T, U> Into for MutexGuard<'a, T>

fn into(self: 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 for MutexGuard<'a, T>

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

impl<T, U> TryInto for MutexGuard<'a, T>

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

impl<T: ?Sized + fmt::Debug> Debug for MutexGuard<'_, T>

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

impl<T: ?Sized + fmt::Display> Display for MutexGuard<'_, T>

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

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

fn deref(self: &Self) -> &<Self as >::Target

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

fn deref_mut(self: &mut Self) -> &mut <Self as >::Target

impl<T: ?Sized> Drop for MutexGuard<'_, T>

fn drop(self: &mut Self)