use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use std::task::Context;
use std::task::Poll;
use crate::ManualMonotonicClock;
#[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);
}
}
}