use atomic_ptr_cell::*;
use std::ptr::null_mut;
use std::sync::atomic::AtomicPtr;
use std::thread;
static CELL: AtomicPtr<String> = AtomicPtr::new(null_mut());
#[test]
fn test() {
let cell: AtomicPtrCell<String> = unsafe { AtomicPtrCell::new(&CELL) };
cell.set("Hello".to_string());
let guard = cell.borrow().unwrap();
assert_eq!("Hello", guard.as_str());
let jh = thread::spawn(move || {
cell.set("World".to_string());
let guard = cell.borrow().unwrap();
assert!("Hello" == guard.as_str() || "World" == guard.as_str());
drop(guard);
});
drop(guard);
let Some(value) = cell.take() else {
_ = jh.join();
let value = cell.take().unwrap();
assert!("Hello" == value.as_str() || "World" == value.as_str());
return;
};
assert!("Hello" == value.as_str() || "World" == value.as_str());
_ = jh.join();
if let Some(value2) = cell.take() {
assert_ne!(value, value2);
}
}