1use prism3_atomic::AtomicRef;
14use std::sync::Arc;
15use std::thread;
16
17#[derive(Debug, Clone)]
18struct Config {
19 version: u32,
20 name: String,
21 value: i32,
22}
23
24fn main() {
25 println!("=== Atomic Reference Example ===\n");
26
27 println!("1. Basic Reference Operations:");
29 let config = Arc::new(Config {
30 version: 1,
31 name: "initial".to_string(),
32 value: 100,
33 });
34 let atomic_config = AtomicRef::new(config.clone());
35
36 println!(" Initial config: {:?}", atomic_config.load());
37
38 let new_config = Arc::new(Config {
39 version: 2,
40 name: "updated".to_string(),
41 value: 200,
42 });
43 atomic_config.store(new_config);
44
45 println!(" Updated config: {:?}", atomic_config.load());
46
47 println!("\n2. Compare-and-Swap:");
49 let config = Arc::new(Config {
50 version: 1,
51 name: "v1".to_string(),
52 value: 10,
53 });
54 let atomic_config = AtomicRef::new(config.clone());
55
56 let current = atomic_config.load();
57 let new_config = Arc::new(Config {
58 version: 2,
59 name: "v2".to_string(),
60 value: 20,
61 });
62
63 match atomic_config.compare_set(¤t, new_config) {
64 Ok(_) => println!(" CAS succeeded: {:?}", atomic_config.load()),
65 Err(actual) => println!(" CAS failed: {:?}", actual),
66 }
67
68 println!("\n3. Functional Updates:");
70 let config = Arc::new(Config {
71 version: 1,
72 name: "counter".to_string(),
73 value: 0,
74 });
75 let atomic_config = AtomicRef::new(config);
76
77 let old = atomic_config.fetch_update(|current| {
78 Arc::new(Config {
79 version: current.version + 1,
80 name: current.name.clone(),
81 value: current.value + 10,
82 })
83 });
84
85 println!(" Old config: {:?}", old);
86 println!(" New config: {:?}", atomic_config.load());
87
88 println!("\n4. Multi-threaded Updates:");
90 let config = Arc::new(Config {
91 version: 0,
92 name: "shared".to_string(),
93 value: 0,
94 });
95 let atomic_config = Arc::new(AtomicRef::new(config));
96 let mut handles = vec![];
97
98 for i in 0..10 {
99 let atomic_config = atomic_config.clone();
100 let handle = thread::spawn(move || {
101 for _ in 0..10 {
102 atomic_config.fetch_update(|current| {
103 Arc::new(Config {
104 version: current.version + 1,
105 name: current.name.clone(),
106 value: current.value + 1,
107 })
108 });
109 }
110 println!(" Thread {} completed", i);
111 });
112 handles.push(handle);
113 }
114
115 for handle in handles {
116 handle.join().unwrap();
117 }
118
119 let final_config = atomic_config.load();
120 println!(" Final config: {:?}", final_config);
121 println!(" Expected version: 100, actual: {}", final_config.version);
122 println!(" Expected value: 100, actual: {}", final_config.value);
123
124 println!("\n=== Example completed ===");
125}