use std::{
sync::{
atomic::{AtomicU32, Ordering},
Arc,
},
time::Duration,
};
use tokio::time::Instant;
pub(crate) struct IdleTracker {
track: IdleTrack,
prev_value: u32,
prev_time: Instant,
}
impl IdleTracker {
pub(super) fn new() -> (Self, IdleTrack) {
let track = IdleTrack(<_>::default());
let this = Self {
track: track.clone(),
prev_value: track.get(),
prev_time: Instant::now(),
};
(this, track)
}
pub(crate) fn check(&mut self) -> Duration {
let now = Instant::now();
let new_value = self.track.get();
if self.prev_value != new_value {
self.prev_value = new_value;
self.prev_time = now;
}
now.duration_since(self.prev_time)
}
}
#[derive(Clone)]
pub(super) struct IdleTrack(Arc<AtomicU32>);
impl IdleTrack {
pub(super) fn update(&self) {
self.0.fetch_add(1, Ordering::Relaxed);
}
fn get(&self) -> u32 {
self.0.load(Ordering::Relaxed)
}
}