this example is from doc
in that use unlinked but in new version not
exist , i use defer_destroy
but raise : double free error
pub fn pop(&self) -> Option<T> {
// become active
let guard = &epoch::pin();
loop {
// snapshot current head
let shared = self.head.load(Ordering::Acquire, guard);
// match over head.as_ref
match unsafe { shared.as_ref() } {
Some(head) => {
// read through the snapshot, *safely*!
let next = head.next.load(Ordering::Relaxed, guard);
if let Ok(_) = self.head.compare_exchange(shared,
next,
Ordering::Release,
Ordering::Relaxed,
guard)
{
unsafe {
guard.defer_destroy(shared);
return Some(ptr::read(&(head).value))
}
}
}
None => return None
}
}
}