use std::sync::{
Arc,
atomic::{AtomicBool, Ordering},
};
#[derive(Clone, Debug, Default)]
pub struct CancelFlag(Arc<AtomicBool>);
impl CancelFlag {
pub fn new() -> Self {
Self::default()
}
pub fn cancel(&self) {
self.0.store(true, Ordering::Release);
}
pub fn is_cancelled(&self) -> bool {
self.0.load(Ordering::Acquire)
}
pub fn reset(&self) {
self.0.store(false, Ordering::Release);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn clones_share_one_flag() {
let flag = CancelFlag::new();
let worker = flag.clone();
assert!(!worker.is_cancelled());
flag.cancel();
assert!(worker.is_cancelled());
flag.reset();
assert!(!worker.is_cancelled());
}
}