pub struct Wait<'a, K, V, Lock = DefaultMutex>where
K: PartialEq,
Lock: ScopedRawMutex,{ /* private fields */ }
Expand description
Future returned from WaitMap::wait()
.
This future is fused, so once it has completed, any future calls to poll
will immediately return Poll::Ready
.
Notes
This future is !Unpin
, as it is unsafe to core::mem::forget
a
Wait
future once it has been polled. For instance, the following code
must not compile:
ⓘ
use maitake_sync::wait_map::Wait;
// Calls to this function should only compile if `T` is `Unpin`.
fn assert_unpin<T: Unpin>() {}
assert_unpin::<Wait<'_, usize, ()>>();
Implementations§
§impl<'map, 'wait, K, V, Lock> Wait<'map, K, V, Lock>where
K: PartialEq,
Lock: ScopedRawMutex,
impl<'map, 'wait, K, V, Lock> Wait<'map, K, V, Lock>where
K: PartialEq,
Lock: ScopedRawMutex,
pub fn subscribe(
self: Pin<&'wait mut Wait<'map, K, V, Lock>>
) -> Subscribe<'wait, 'map, K, V, Lock> ⓘ
pub fn subscribe( self: Pin<&'wait mut Wait<'map, K, V, Lock>> ) -> Subscribe<'wait, 'map, K, V, Lock> ⓘ
Returns a future that completes when the Wait
item has been
added to the WaitMap
, and is ready to receive data
This is useful for ensuring that a receiver is ready before sending a message that will elicit the expected response.
Example
ⓘ
use std::sync::Arc;
use maitake::scheduler;
use maitake_sync::wait_map::{WaitMap, WakeOutcome};
use futures_util::pin_mut;
let scheduler = Scheduler::new();
let q = Arc::new(WaitMap::new());
let q2 = q.clone();
scheduler.spawn(async move {
let wait = q2.wait(0);
// At this point, we have created the future, but it has not yet
// been added to the queue. We could immediately await 'wait',
// but then we would be unable to progress further. We must
// first pin the `wait` future, to ensure that it does not move
// until it has been completed.
pin_mut!(wait);
wait.as_mut().subscribe().await.unwrap();
// We now know the waiter has been enqueued, at this point we could
// send a message that will cause key == 0 to be returned, without
// worrying about racing with the expected response, e.g:
//
// sender.send_with_id(0, SomeMessage).await?;
//
let val = wait.await.unwrap();
assert_eq!(val, 10);
});
assert!(matches!(q.wake(&0, 100), WakeOutcome::NoMatch(_)));
let tick = scheduler.tick();
assert!(matches!(q.wake(&0, 100), WakeOutcome::Woke));
Trait Implementations§
§impl<'a, K, V, Lock> Drop for Wait<'a, K, V, Lock>where
K: PartialEq,
Lock: ScopedRawMutex,
impl<'a, K, V, Lock> Drop for Wait<'a, K, V, Lock>where
K: PartialEq,
Lock: ScopedRawMutex,
impl<'pin, 'a, K, V, Lock> Unpin for Wait<'a, K, V, Lock>
Auto Trait Implementations§
impl<'a, K, V, Lock = DefaultMutex> !RefUnwindSafe for Wait<'a, K, V, Lock>
impl<'a, K, V, Lock> Send for Wait<'a, K, V, Lock>
impl<'a, K, V, Lock = DefaultMutex> !Sync for Wait<'a, K, V, Lock>
impl<'a, K, V, Lock = DefaultMutex> !UnwindSafe for Wait<'a, K, V, Lock>
Blanket Implementations§
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<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<F> IntoFuture for Fwhere
F: Future,
impl<F> IntoFuture for Fwhere
F: Future,
§type IntoFuture = F
type IntoFuture = F
Which kind of future are we turning this into?
source§fn into_future(self) -> <F as IntoFuture>::IntoFuture
fn into_future(self) -> <F as IntoFuture>::IntoFuture
Creates a future from a value. Read more