use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};
use crate::timer::metrics::TimerMetricsInner;
use crate::timing_wheel::state::{EntryState, TimeoutState};
#[derive(Clone, Debug)]
pub struct Timeout {
state: Arc<TimeoutState>,
metrics: Arc<TimerMetricsInner>,
permits: Arc<AtomicUsize>,
}
impl Timeout {
pub(crate) fn new(
state: Arc<TimeoutState>,
metrics: Arc<TimerMetricsInner>,
permits: Arc<AtomicUsize>,
) -> Self {
Self {
state,
metrics,
permits,
}
}
pub fn cancel(&self) -> bool {
if self.state.cancel() {
self.metrics.cancelled();
self.permits.fetch_sub(1, Ordering::AcqRel);
return true;
}
false
}
pub fn is_cancelled(&self) -> bool {
self.state.load() == EntryState::Cancelled
}
pub fn is_expired(&self) -> bool {
self.state.load() == EntryState::Expired
}
}