use crate::ManualMonotonicClock;
use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use std::task::{
Context,
Poll,
};
#[derive(Debug)]
pub struct ManualWaiterFuture {
clock: Arc<ManualMonotonicClock>,
observer_id: Option<u64>,
}
impl ManualWaiterFuture {
#[inline]
pub(crate) fn new(
clock: Arc<ManualMonotonicClock>,
expected_count: usize,
) -> Self {
let observer_id = clock.register_waiter_observer(expected_count);
Self { clock, observer_id }
}
}
impl Future for ManualWaiterFuture {
type Output = ();
fn poll(
mut self: Pin<&mut Self>,
context: &mut Context<'_>,
) -> Poll<Self::Output> {
let Some(observer_id) = self.observer_id else {
return Poll::Ready(());
};
let result = self.clock.poll_waiter_observer(observer_id, context);
if result.is_ready() {
self.observer_id = None;
}
result
}
}
impl Drop for ManualWaiterFuture {
#[inline]
fn drop(&mut self) {
if let Some(observer_id) = self.observer_id.take() {
self.clock.unregister_waiter_observer(observer_id);
}
}
}