use kovan::{Atomic, Shared, pin};
use std::sync::atomic::Ordering;
fn main() {
let atomic = Atomic::new(Box::into_raw(Box::new(42)));
let guard = pin();
let ptr = atomic.load(Ordering::Acquire, &guard);
unsafe {
if let Some(value) = ptr.as_ref() {
println!("Value: {}", value);
assert_eq!(*value, 42);
}
}
let new_value = Box::into_raw(Box::new(100));
match atomic.compare_exchange(
ptr,
unsafe { Shared::from_raw(new_value) },
Ordering::AcqRel,
Ordering::Acquire,
&guard,
) {
Ok(_) => println!("Successfully updated value"),
Err(_) => println!("Update failed"),
}
let new_ptr = atomic.load(Ordering::Acquire, &guard);
unsafe {
if let Some(value) = new_ptr.as_ref() {
println!("New value: {}", value);
assert_eq!(*value, 100);
}
}
drop(guard);
println!("Example completed successfully!");
}