1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//! Async manual-reset and auto-reset event primitives.
//!
//! This crate provides async event primitives:
//!
//! * **Manual-reset events** ([`ManualResetEvent`], [`LocalManualResetEvent`]) — a gate
//! that, once set, releases all current and future awaiters until explicitly
//! reset via [`reset()`][ManualResetEvent::reset].
//! * **Auto-reset events** ([`AutoResetEvent`], [`LocalAutoResetEvent`]) — a signal
//! that releases at most one awaiter per
//! [`set()`][AutoResetEvent::set] call, automatically consuming the
//! signal when an awaiter is released.
//!
//! Each family comes in a thread-safe variant (`Send + Sync`) and a
//! single-threaded `Local` variant for improved efficiency when thread safety
//! is not required.
//!
//! # Boxed vs embedded storage
//!
//! Every event type can be created in two ways:
//!
//! * **[`boxed()`][AutoResetEvent::boxed]** — the event manages its
//! own storage. Simple to use: the returned handle is `Clone` and
//! can be shared freely. Best for most use cases.
//! * **[`embedded()`][AutoResetEvent::embedded]** — borrows
//! caller-provided storage (`Embedded*` types) instead of
//! allocating. This eliminates one allocation per event, which
//! matters when events are created on a hot path or embedded
//! inside other data structures. The caller must ensure the
//! storage outlives all handles and wait futures, and the
//! `embedded()` call is `unsafe` to reflect this contract.
//!
//! Events are lightweight cloneable handles. All clones from the same
//! [`boxed()`][AutoResetEvent::boxed] or
//! [`embedded()`][AutoResetEvent::embedded] origin share the same
//! underlying state.
//!
//! # Manual-reset example
//!
//! ```
//! use events::ManualResetEvent;
//!
//! #[tokio::main]
//! async fn main() {
//! let event = ManualResetEvent::boxed();
//! let setter = event.clone();
//!
//! // Producer opens the gate from a background task.
//! tokio::spawn(async move {
//! setter.set();
//! });
//!
//! // Consumer waits for the gate to open.
//! event.wait().await;
//!
//! // The gate stays open — it must be explicitly closed.
//! assert!(event.try_wait());
//! }
//! ```
//!
//! # Auto-reset example
//!
//! ```
//! use events::AutoResetEvent;
//!
//! #[tokio::main]
//! async fn main() {
//! let event = AutoResetEvent::boxed();
//! let setter = event.clone();
//!
//! // Producer signals from a background task.
//! tokio::spawn(async move {
//! setter.set();
//! });
//!
//! // Consumer waits for the signal.
//! event.wait().await;
//!
//! // Signal was consumed.
//! assert!(!event.try_wait());
//! }
//! ```
pub use ;
pub use *;
pub use ;
pub use ;
pub use ;