use std::cell::UnsafeCell; use std::marker::PhantomData; use lock_api::RawRwLock; use crate::key::Keyable; mod rwlock; mod read_lock; mod write_lock; mod read_guard; mod write_guard; #[cfg(feature = "spin")] pub type SpinRwLock = RwLock>; #[cfg(feature = "parking_lot")] pub type ParkingRwLock = RwLock; pub struct RwLock { raw: R, value: UnsafeCell, } pub struct ReadLock<'a, T: ?Sized, R>(&'a RwLock); pub struct WriteLock<'a, T: ?Sized, R>(&'a RwLock); pub struct RwLockReadRef<'a, T: ?Sized, R: RawRwLock>(&'a RwLock); pub struct RwLockWriteRef<'a, T: ?Sized, R: RawRwLock>(&'a RwLock); pub struct RwLockReadGuard<'a, 'key, T: ?Sized, Key: Keyable + 'key, R: RawRwLock> { rwlock: RwLockReadRef<'a, T, R>, thread_key: Key, _phantom: PhantomData<&'key ()>, } pub struct RwLockWriteGuard<'a, 'key, T: ?Sized, Key: Keyable + 'key, R: RawRwLock> { rwlock: RwLockWriteRef<'a, T, R>, thread_key: Key, _phantom: PhantomData<&'key ()>, }