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
impl EventTrigger
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for EventTrigger
impl !Send for EventTrigger
impl !Sync for EventTrigger
impl !UnwindSafe for EventTrigger
impl Freeze for EventTrigger
impl Unpin for EventTrigger
impl UnsafeUnpin for EventTrigger
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