0 day streak
rust / expert
Snippet

Custom Waker-Driven Future Implementation

Manual Future implementations require thread-safe waker registration and atomic synchronization to notify asynchronous executors when data becomes available without spin-locking.

snippet.rs
rust
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
use std::future::Future;
use std::pin::Pin;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::task::{Context, Poll, Waker};
pub struct SignalFuture {
state: Arc<SignalState>,
}
struct SignalState {
completed: AtomicBool,
waker: std::sync::Mutex<Option<Waker>>,
}
impl Future for SignalFuture {
type Output = &'static str;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
if self.state.completed.load(Ordering::Acquire) {
Poll::Ready("Signal received")
} else {
let mut waker_guard = self.state.waker.lock().unwrap();
*waker_guard = Some(cx.waker().clone());
Poll::Pending
}
}
}
Breakdown
1
pub struct SignalFuture {
Defines a wrapper struct holding a shared atomic state reference across async contexts.
2
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
Implements the core polling entry point required by the std Future trait.
3
if self.state.completed.load(Ordering::Acquire) {
Checks the atomic completion state with Acquire memory ordering.
4
*waker_guard = Some(cx.waker().clone());
Registers the reactor Waker inside a Mutex for delayed execution notification.