Safe wrapper around AtomicPtr.
Instead of swapping a pointer, it works with references and lifetimes, allowing a safe API.
Two versions are provided:
RefSwapfor swapping referencesOptionRefSwapfor swappingOption<&T>. It encodesNoneas a null pointer and has no additionnal overhead.
use ref_swap::RefSwap;
use core::sync::atomic::Ordering;
let a = 10;
let b = 20;
let reference = RefSwap::new(&a);
// In another thread
let loaded = reference.load(Ordering::Relaxed);
assert_eq!(loaded, &a);
assert!(core::ptr::eq(loaded, &a));
reference.store(&b, Ordering::Relaxed);
// In another thread
let loaded = reference.load(Ordering::Relaxed);
assert_eq!(loaded, &b);
assert!(core::ptr::eq(loaded, &b));use ref_swap::OptionRefSwap;
use core::sync::atomic::Ordering;
let a = 10;
let b = 20;
let reference = OptionRefSwap::new(None);
// In another thread
let loaded = reference.load(Ordering::Relaxed);
assert_eq!(loaded, None);
reference.store(Some(&b), Ordering::Relaxed);
// In another thread
let loaded = reference.load(Ordering::Relaxed);
assert_eq!(loaded, Some(&b));
assert!(core::ptr::eq(loaded.unwrap(), &b));
reference.store(Some(&a), Ordering::Relaxed);
// In another thread
let loaded = reference.load(Ordering::Relaxed);
assert_eq!(loaded, Some(&a));
assert!(core::ptr::eq(loaded.unwrap(), &a));This project is licensed under the Apache-2.0 or MIT. Configuration files and examples are licensed under the
CC0 1.0 license. For more information, see the license header in
each file. You can find a copy of the license texts in the
LICENSES directory.
This project complies with version 3.0 of the REUSE specification.