     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30

    #[cfg(not(all(test, loom)))]
    pub(crate) mod sync {
        pub(crate) mod atomic {
            pub(crate) use core::sync::atomic::{fence, AtomicPtr, AtomicUsize, Ordering};

            pub(crate) trait AtomicMut<T> {
                fn with_mut<F, R>(&mut self, f: F) -> R
                where
                    F: FnOnce(&mut *mut T) -> R;
            }

            impl<T> AtomicMut<T> for AtomicPtr<T> {
                fn with_mut<F, R>(&mut self, f: F) -> R
                where
                    F: FnOnce(&mut *mut T) -> R,
                {
                    f(self.get_mut())
                }
            }
        }
    }

    #[cfg(all(test, loom))]
    pub(crate) mod sync {
        pub(crate) mod atomic {
            pub(crate) use loom::sync::atomic::{fence, AtomicPtr, AtomicUsize, Ordering};

            pub(crate) trait AtomicMut<T> {}
        }
    }