1use alloc::sync::Arc;
8use core::sync::atomic::{AtomicBool, Ordering};
9
10#[derive(Clone, Debug, Default)]
15pub struct CancellationToken(Arc<AtomicBool>);
16
17impl CancellationToken {
18 pub fn new() -> Self {
20 Self::default()
21 }
22
23 pub fn cancel(&self) {
25 self.0.store(true, Ordering::Relaxed);
26 }
27
28 pub fn is_cancelled(&self) -> bool {
30 self.0.load(Ordering::Relaxed)
31 }
32}
33
34#[cfg(test)]
35mod tests {
36 use super::*;
37
38 #[test]
39 fn test_cancellation_token_is_shared() {
40 let token = CancellationToken::new();
41 let clone = token.clone();
42 assert!(!token.is_cancelled());
43 clone.cancel();
44 assert!(token.is_cancelled());
45 assert!(clone.is_cancelled());
46 }
47}