use std::sync::atomic::{
AtomicU8,
Ordering,
};
pub struct DelayedTaskState;
impl DelayedTaskState {
pub const PENDING: u8 = 0;
pub const STARTED: u8 = 1;
pub const CANCELLED: u8 = 2;
pub fn cancel(task_state: &AtomicU8) -> bool {
task_state
.compare_exchange(
Self::PENDING,
Self::CANCELLED,
Ordering::AcqRel,
Ordering::Acquire,
)
.is_ok()
}
pub fn start(task_state: &AtomicU8) -> bool {
task_state
.compare_exchange(
Self::PENDING,
Self::STARTED,
Ordering::AcqRel,
Ordering::Acquire,
)
.is_ok()
}
pub fn is_cancelled(task_state: &AtomicU8) -> bool {
task_state.load(Ordering::Acquire) == Self::CANCELLED
}
}
pub const TASK_PENDING: u8 = DelayedTaskState::PENDING;
pub const TASK_CANCELLED: u8 = DelayedTaskState::CANCELLED;
pub fn cancel_task_state(task_state: &AtomicU8) -> bool {
DelayedTaskState::cancel(task_state)
}
pub fn start_task_state(task_state: &AtomicU8) -> bool {
DelayedTaskState::start(task_state)
}
pub fn is_task_cancelled(task_state: &AtomicU8) -> bool {
DelayedTaskState::is_cancelled(task_state)
}