Skip to main content

EventTrigger

Struct EventTrigger 

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

The sending half of a manual event. Call fire to wake all processes currently waiting on the paired EventAwaitable, and to make any future awaits on that same awaitable resolve immediately.

Dropping a trigger without firing it strands its waiters. If an EventTrigger is dropped without fire() being called, the event never fires: any process currently awaiting the paired EventAwaitable — and any that awaits it later — will suspend forever (until the run ends and SimEnv’s Drop reclaims the suspended processes). This is a normal discrete-event outcome (a signal that simply never arrives), not a panic; if a process must not block indefinitely, race the awaitable against a timeout via any_of!.

One trigger, many waiters — including one that only starts waiting after the fire (the latch makes it resolve immediately):

use simu::SimEnv;

let mut env = SimEnv::with_seed(0);
let (trigger, ready) = env.event();

// Fires at t = 2.
let h = env.handle();
env.spawn(async move {
    h.timeout(2.0).await;
    trigger.fire(); // consumes the trigger — an event fires at most once
});

// Suspends now, woken at t = 2.
let r = ready.clone(); // Clone = same underlying event
let h1 = env.handle();
env.spawn(async move {
    r.await;
    assert_eq!(h1.now(), 2.0);
});

// Starts waiting at t = 3 — after the fire — and resolves immediately.
let h2 = env.handle();
env.spawn(async move {
    h2.timeout(3.0).await;
    ready.await; // already fired: no suspension
    assert_eq!(h2.now(), 3.0);
});

env.run();

Implementations§

Source§

impl EventTrigger

Source

pub fn fire(self)

Fire the event.

All processes currently suspended on the paired EventAwaitable are woken immediately. Any process that awaits the event after this call will also resolve without suspending.

Trait Implementations§

Source§

impl Debug for EventTrigger

Source§

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

Formats the value using the given formatter. 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<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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, 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