atomic_sync 0.2.0

Atomic-based synchronization implementing traits in `abs_sync`
use core::{
    borrow::BorrowMut,
    cell::UnsafeCell,
    fmt,
    marker::{PhantomData, PhantomPinned},
    mem::ManuallyDrop,
    ops::Try,
    pin::Pin,
    ptr::{self, NonNull},
    sync::atomic::*,
};

use funty::{Integral, Unsigned};

use atomex::{
    x_deps::funty, AtomexPtr, Bitwise, CmpxchResult, StrictOrderings,
    TrAtomicCell, TrAtomicData, TrAtomicFlags, TrCmpxchOrderings
};
use abs_sync::{
    cancellation::TrCancellationToken,
    sync_lock::{self, TrSyncRwLock},
    sync_tasks::TrSyncTask,
};

use super::{
    acquire_::{Acquire, AtomAcqLinkPtr},
};

#[derive(Debug)]
#[repr(C)]
pub struct SpinningRwLock<T, B = AtomicUsize, D = usize, O = StrictOrderings>
where
    T: ?Sized,
    B: BorrowMut<<D as TrAtomicData>::AtomicCell>,
    D: TrAtomicData + Unsigned,
    <D as TrAtomicData>::AtomicCell: Bitwise,
    O: TrCmpxchOrderings,
{
    _pin_: PhantomPinned,
    stat_: RwLockState<B, D, O>,
    data_: UnsafeCell<T>,
}

impl<T, B, D, O> SpinningRwLock<T, B, D, O>
where
    T: ?Sized,
    B: BorrowMut<<D as TrAtomicData>::AtomicCell>,
    D: TrAtomicData + Unsigned,
    <D as TrAtomicData>::AtomicCell: Bitwise,
    O: TrCmpxchOrderings,
{
    pub const fn acquire(&self) -> Acquire<'_, T, B, D, O> {
        Acquire::new(self)
    }

    #[inline]
    pub(super) fn data_cell_(&self) -> &UnsafeCell<T> {
        &self.data_
    }
}

impl<T, B, D, O> TrSyncRwLock for SpinningRwLock<T, B, D, O>
where
    T: ?Sized,
    B: BorrowMut<<D as TrAtomicData>::AtomicCell>,
    D: TrAtomicData + Unsigned,
    <D as TrAtomicData>::AtomicCell: Bitwise,
    O: TrCmpxchOrderings,
{
    type Target = T;

    #[inline]
    fn acquire(&self) -> impl sync_lock::TrAcquire<'_, Self::Target> {
        SpinningRwLock::acquire(self)
    }
}

#[derive(Debug)]
pub(super) struct RwLockState<B, D, O>
where
    B: BorrowMut<<D as TrAtomicData>::AtomicCell>,
    D: TrAtomicData + Unsigned,
    <D as TrAtomicData>::AtomicCell: Bitwise,
    O: TrCmpxchOrderings,
{
    flag_: B,
    head_: AtomAcqLinkPtr<O>,
    _mark_d_: PhantomData<D>,
}