#![allow(unused)]
pub mod epoch;
#[cfg(not(loom))]
pub use std::sync::atomic::{AtomicUsize, Ordering};
#[cfg(loom)]
pub use loom::sync::atomic::{AtomicUsize, Ordering};
#[cfg(not(loom))]
pub use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard};
#[cfg(loom)]
mod loom_rwlock {
use loom::sync::{
RwLock as LoomRwLock, RwLockReadGuard as LoomReadGuard, RwLockWriteGuard as LoomWriteGuard,
};
pub struct RwLock<T>(LoomRwLock<T>);
impl<T> RwLock<T> {
pub fn new(value: T) -> Self {
RwLock(LoomRwLock::new(value))
}
pub fn read(&self) -> RwLockReadGuard<'_, T> {
RwLockReadGuard(self.0.read().unwrap())
}
pub fn write(&self) -> RwLockWriteGuard<'_, T> {
RwLockWriteGuard(self.0.write().unwrap())
}
pub fn try_read(&self) -> Option<RwLockReadGuard<'_, T>> {
self.0.try_read().ok().map(RwLockReadGuard)
}
pub fn try_write(&self) -> Option<RwLockWriteGuard<'_, T>> {
self.0.try_write().ok().map(RwLockWriteGuard)
}
}
pub struct RwLockReadGuard<'a, T>(LoomReadGuard<'a, T>);
impl<'a, T> std::ops::Deref for RwLockReadGuard<'a, T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
pub struct RwLockWriteGuard<'a, T>(LoomWriteGuard<'a, T>);
impl<'a, T> std::ops::Deref for RwLockWriteGuard<'a, T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
impl<'a, T> std::ops::DerefMut for RwLockWriteGuard<'a, T> {
fn deref_mut(&mut self) -> &mut T {
&mut self.0
}
}
}
#[cfg(loom)]
pub use loom_rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard};
#[cfg(not(loom))]
pub use std::cell::UnsafeCell;
#[cfg(loom)]
mod loom_unsafe_cell {
use loom::cell::UnsafeCell as LoomUnsafeCell;
pub struct UnsafeCell<T>(LoomUnsafeCell<T>);
impl<T> UnsafeCell<T> {
pub fn new(value: T) -> Self {
UnsafeCell(LoomUnsafeCell::new(value))
}
pub fn get(&self) -> *mut T {
unsafe { self.0.get().deref() as *const T as *mut T }
}
pub fn into_inner(self) -> T {
self.0.into_inner()
}
}
}
#[cfg(loom)]
pub use loom_unsafe_cell::UnsafeCell;