1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//! Provides a token-based mechanism for graceful cancellation.
use ;
use Arc;
/// A token that can be used to signal cancellation to long-running operations.
///
/// This struct is a cloneable, thread-safe wrapper around an `Arc<AtomicBool>`.
/// It provides a clear and ergonomic API for checking if an operation should be
/// gracefully terminated.
///
/// # Examples
///
/// ```
/// use dircat::CancellationToken;
/// use std::thread;
/// use std::time::Duration;
///
/// let token = CancellationToken::new();
/// let token_clone = token.clone();
///
/// let handle = thread::spawn(move || {
/// while !token_clone.is_cancelled() {
/// println!("Working...");
/// thread::sleep(Duration::from_millis(100));
/// }
/// println!("Work cancelled.");
/// });
///
/// // Let the thread work for a bit
/// thread::sleep(Duration::from_millis(250));
///
/// // Signal cancellation from another thread
/// token.cancel();
///
/// handle.join().unwrap();
/// ```
/// Creates a new `CancellationToken` in a non-cancelled state.
///
/// This is equivalent to calling `CancellationToken::new()`.
///
/// # Examples
///
/// ```
/// use dircat::CancellationToken;
///
/// let token: CancellationToken = Default::default();
/// assert!(!token.is_cancelled());
/// ```