reference/
reference.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025.
4 *    3-Prism Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9//! # Atomic Reference Example
10//!
11//! Demonstrates using atomic references for lock-free data structures.
12
13use 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    // Example 1: Basic reference operations
28    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    // Example 2: Compare-and-swap
48    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(&current, new_config) {
64        Ok(_) => println!("   CAS succeeded: {:?}", atomic_config.load()),
65        Err(actual) => println!("   CAS failed: {:?}", actual),
66    }
67
68    // Example 3: Functional updates
69    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    // Example 4: Multi-threaded updates
89    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}