struct Shared<T> {
msg: OnceLock<Result<T, SenderDropped>>,
wakers: Mutex<Result<DenseSlotMap<WakerKey, Waker>, WakersAlreadyWoken>>,
}Expand description
State shared between the sender and receivers. Correctness:
Sending a message:
- set the message OnceLock (A)
- acquire the wakers Mutex
- take all wakers (B)
- release the wakers Mutex (C)
- wake all wakers
Polling:
- if message was set, return it (fast path)
- acquire the wakers Mutex (D)
- if message was set, return it (E)
- add waker (F)
- release the wakers Mutex
When the wakers Mutex is released at (C), a release-store operation is performed by the Mutex, which means that the message set at (A) will be seen by all future acquire-load operations by that same Mutex. More specifically, after (C) has occurred and when the same mutex is acquired at (D), the message set at (A) is guaranteed to be visible at (E). This means that after the wakers are taken at (B), no future wakers will be added at (F) and no waker will be “lost”.
Fields§
§msg: OnceLock<Result<T, SenderDropped>>§wakers: Mutex<Result<DenseSlotMap<WakerKey, Waker>, WakersAlreadyWoken>>The wakers waiting for a value to be sent.
Will be set to Err after the wakers have been woken.
Trait Implementations§
Auto Trait Implementations§
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more