use std::sync::{
Arc,
atomic::{AtomicUsize, Ordering},
mpsc,
};
use std::time::Duration;
use timerwheel::timer::MetricSink;
use timerwheel::{Timer, TimerMetrics};
struct CountingMetricSink {
observations: Arc<AtomicUsize>,
}
impl MetricSink for CountingMetricSink {
fn observe_metrics(&self, _metrics: TimerMetrics) {
self.observations.fetch_add(1, Ordering::Relaxed);
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let observations = Arc::new(AtomicUsize::new(0));
let timer = Timer::builder()
.metric_sink(CountingMetricSink {
observations: Arc::clone(&observations),
})
.build()?;
let (tx, rx) = mpsc::channel();
timer.schedule(Duration::from_millis(10), move || {
tx.send(()).expect("send succeeds");
})?;
rx.recv_timeout(Duration::from_secs(1))?;
let metrics = timer.metrics();
println!(
"scheduled={} expired={} pending={} observations={}",
metrics.scheduled_timeouts,
metrics.expired_timeouts,
metrics.pending_timeouts,
observations.load(Ordering::Relaxed)
);
timer.shutdown()?;
Ok(())
}