use std::sync::{
Arc,
atomic::{
AtomicU8,
Ordering,
},
};
use super::delayed_task_state::{
TASK_CANCELLED,
cancel_task_state,
};
#[derive(Clone)]
pub struct DelayedTaskHandle {
state: Arc<AtomicU8>,
on_cancelled: Arc<dyn Fn() + Send + Sync + 'static>,
}
impl DelayedTaskHandle {
pub(crate) fn new(
state: Arc<AtomicU8>,
on_cancelled: Arc<dyn Fn() + Send + Sync + 'static>,
) -> Self {
Self {
state,
on_cancelled,
}
}
pub fn cancel(&self) -> bool {
let cancelled = cancel_task_state(&self.state);
if cancelled {
(self.on_cancelled)();
}
cancelled
}
pub fn is_cancelled(&self) -> bool {
self.state.load(Ordering::Acquire) == TASK_CANCELLED
}
}