use std::sync::atomic::{AtomicPtr, Ordering};
pub struct LockFreeStack<T> { head: AtomicPtr<Node<T>> }
impl<T> LockFreeStack<T> {
pub fn push(&self, data: T) {
let new_node = Box::into_raw(Box::new(Node { data, next: ptr::null_mut() }));
loop {
let head_ptr = self.head.load(Ordering::Acquire);
unsafe { (*new_node).next = head_ptr; }
if self.head.compare_exchange(head_ptr, new_node, Ordering::Release, Ordering::Relaxed).is_ok() { break }
}
}
}