Skip to main content

Notify

Struct Notify 

Source
pub struct Notify { /* private fields */ }
Expand description

A notify primitive for signaling events.

Notify provides a mechanism for tasks to wait for events and for other tasks to signal those events. It is similar to a condition variable but designed for async/await.

§Example

let notify = Notify::new();

// Spawn a task that waits for notification
let fut = async {
    notify.notified().await;
    println!("notified!");
};

// Later, signal the waiter
notify.notify_one();

Implementations§

Source§

impl Notify

Source

pub fn new() -> Self

Creates a new Notify in the empty state.

Source

pub fn notified(&self) -> Notified<'_>

Returns a future that completes when this Notify is notified.

The returned future is cancel-safe: if dropped before completion, the waiter is cleanly removed.

§Example
use asupersync::sync::Notify;
use std::sync::{
    Arc,
    atomic::{AtomicBool, Ordering},
};

let notify = Arc::new(Notify::new());
let ready = Arc::new(AtomicBool::new(false));

let signaler = {
    let notify = Arc::clone(&notify);
    let ready = Arc::clone(&ready);

    std::thread::spawn(move || {
        ready.store(true, Ordering::Release);
        notify.notify_one();
    })
};

notify.notified().await;
assert!(ready.load(Ordering::Acquire));
signaler.join().expect("signaler thread panicked");
Source

pub async fn wait_until<F>(&self, predicate: F)
where F: FnMut() -> bool,

Waits until predicate returns true, re-checking it after every wake.

The predicate is evaluated before parking and again after each notification, so callers can pair a state transition with notify_one() / notify_waiters() without a separate check-then-park race window.

§Example
use asupersync::sync::Notify;
use std::sync::{
    Arc,
    atomic::{AtomicBool, Ordering},
};

let notify = Arc::new(Notify::new());
let ready = Arc::new(AtomicBool::new(false));

let signaler = {
    let notify = Arc::clone(&notify);
    let ready = Arc::clone(&ready);

    std::thread::spawn(move || {
        ready.store(true, Ordering::Release);
        notify.notify_one();
    })
};

notify
    .wait_until(|| ready.load(Ordering::Acquire))
    .await;
assert!(ready.load(Ordering::Acquire));
signaler.join().expect("signaler thread panicked");
Source

pub fn notify_one(&self) -> bool

Notifies one waiting task.

If no task is currently waiting, the notification is stored and will be delivered to the next task that calls notified().await.

If multiple tasks are waiting, exactly one will be woken.

Returns true when an active waiter was selected and woken, or false when no waiter was available and the notification was stored.

Source

pub fn notify_waiters(&self)

Notifies all waiting tasks.

This wakes all tasks that are currently waiting. Tasks that start waiting after this call will not be affected.

Source

pub fn waiter_count(&self) -> usize

Returns the number of tasks currently waiting.

Trait Implementations§

Source§

impl Debug for Notify

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Default for Notify

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Drop for Notify

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

Auto Trait Implementations§

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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: NoopSpan) -> Self

Instruments this future with a span (no-op when disabled).
Source§

fn in_current_span(self) -> Self

Instruments this future with the current span (no-op when disabled).
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> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V