#[derive(Debug)]
#[repr(C)]
struct Synch<T>
{
tail: AtomicPtr<SynchNode<T>>, }
impl<T> Drop for Synch<T>
{
#[inline(always)]
fn drop(&mut self)
{
let tail = self.tail.load(Acquire);
unsafe { drop_in_place(tail) };
SynchNode::free_after_drop(unsafe { NonNull::new_unchecked(tail) })
}
}
impl<T> Synch<T>
{
#[inline(always)]
unsafe fn ccsynch_init(this: &UnsafeCell<Synch<T>>)
{
let this = { &mut * this.get() };
this.tail = AtomicPtr::new(SynchNode::ccsynch_init_node().as_ptr());
}
#[inline(always)]
fn swap_tail_returning_previous(this: &UnsafeCell<Synch<T>>, next: NonNull<SynchNode<T>>) -> NonNull<SynchNode<T>>
{
let this = unsafe { &* this.get() };
let raw = this.tail.swap(next.as_ptr(), AcqRel);
unsafe { NonNull::new_unchecked(raw) }
}
}