pub struct WaitCondition<F>{ /* private fields */ }Expand description
A named condition variable backed by a WaitQueue.
Stores a reusable condition closure alongside the queue. Multiple tasks
can wait on the same WaitCondition; they are all woken when
notify_all is called, and each re-checks the stored
condition before returning.
Inspired by Theseus OS wait_condition crate. Wrap in an Arc to share
across tasks.
§Example
static FLAG: AtomicBool = AtomicBool::new(false);
static COND: WaitCondition<_> = WaitCondition::new(|| FLAG.load(Ordering::Acquire));
// Waiter task:
COND.wait();
// Notifier task:
FLAG.store(true, Ordering::Release);
COND.notify_all();Implementations§
Source§impl<F: Fn() -> bool> WaitCondition<F>
impl<F: Fn() -> bool> WaitCondition<F>
Sourcepub fn wait(&self)
pub fn wait(&self)
Block the current task until the stored condition returns true.
Returns immediately (without blocking) if the condition is already true. Spurious wakeups are impossible.
§Panics
Panics if called outside of a task context.
Sourcepub fn notify_one(&self) -> bool
pub fn notify_one(&self) -> bool
Wake one task waiting on this condition.
The woken task will re-check the condition before returning from
wait. Returns true if a task was woken.
Sourcepub fn notify_all(&self) -> usize
pub fn notify_all(&self) -> usize
Wake all tasks waiting on this condition.
Each woken task will re-check the condition independently. Returns the number of tasks that were moved back to the ready queue.
Auto Trait Implementations§
impl<F> !Freeze for WaitCondition<F>
impl<F> !RefUnwindSafe for WaitCondition<F>
impl<F> Send for WaitCondition<F>where
F: Send,
impl<F> Sync for WaitCondition<F>where
F: Sync,
impl<F> Unpin for WaitCondition<F>where
F: Unpin,
impl<F> UnsafeUnpin for WaitCondition<F>where
F: UnsafeUnpin,
impl<F> UnwindSafe for WaitCondition<F>where
F: UnwindSafe,
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
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>
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>
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