Skip to main content

Mutex

Struct Mutex 

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

A single-threaded async mutex.

This mutex is intentionally !Send and !Sync: it is only for tasks that remain on one runite runtime thread.

§Differences from blocking and multithreaded mutexes

This mutex never blocks an OS thread and does not poison when a holder panics. Unlike std::sync::Mutex or Tokio’s multithreaded mutex, it has no Send/owned guard form: guards and wait futures are local to one runtime thread. Contended waiters are queued FIFO.

§Examples

use std::cell::Cell;
use std::rc::Rc;

use runite::sync::Mutex;

let mutex = Rc::new(Mutex::new(1));
let observed = Rc::new(Cell::new(0));

runite::spawn({
    let mutex = Rc::clone(&mutex);
    let observed = Rc::clone(&observed);
    async move {
        let mut guard = mutex.lock().await;
        *guard += 41;
        observed.set(*guard);
    }
});

runite::run();

assert_eq!(observed.get(), 42);
assert_eq!(*mutex.try_lock().expect("mutex should be unlocked"), 42);

Implementations§

Source§

impl<T> Mutex<T>

Source

pub fn new(value: T) -> Self

Creates a mutex containing value.

Source§

impl<T: ?Sized> Mutex<T>

Source

pub async fn lock(&self) -> MutexGuard<'_, T>

Waits until the mutex is available and returns a guard.

Waiters are woken in FIFO order. Dropping the returned MutexGuard releases the mutex to the next waiter, if any.

§Cancellation

Dropping the lock() future before it is selected removes it from the waiter queue. If it has already been selected but is dropped before returning a guard, the lock is passed to the next waiter instead of being leaked.

Source

pub fn try_lock(&self) -> Option<MutexGuard<'_, T>>

Attempts to acquire the mutex without waiting.

Returns None if the mutex is currently locked or if queued waiters should acquire it first.

Auto Trait Implementations§

§

impl<T> !Freeze for Mutex<T>

§

impl<T> !RefUnwindSafe for Mutex<T>

§

impl<T> !Send for Mutex<T>

§

impl<T> !Sync for Mutex<T>

§

impl<T> !UnwindSafe for Mutex<T>

§

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

§

impl<T> UnsafeUnpin for Mutex<T>
where T: UnsafeUnpin + ?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> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more