#![allow(missing_docs)]
pub use condvar::MovableCondvar as Condvar;
pub type Mutex<T> = lock_api::Mutex<RawMutex, T>;
pub type RwLock<T> = lock_api::RwLock<RawRwLock, T>;
mod condvar;
mod futex;
mod futex_rwlock;
mod wait_wake;
use futex::MovableMutex;
use futex_rwlock::MovableRwLock;
#[repr(transparent)]
pub struct RawMutex(MovableMutex);
#[repr(transparent)]
pub struct RawRwLock(MovableRwLock);
unsafe impl lock_api::RawMutex for RawMutex {
type GuardMarker = lock_api::GuardNoSend;
const INIT: Self = Self(MovableMutex::new());
fn lock(&self) {
unsafe { self.0.lock() }
}
fn try_lock(&self) -> bool {
unsafe { self.0.try_lock() }
}
unsafe fn unlock(&self) {
self.0.unlock()
}
}
unsafe impl lock_api::RawRwLock for RawRwLock {
type GuardMarker = lock_api::GuardNoSend;
const INIT: Self = Self(MovableRwLock::new());
fn lock_shared(&self) {
unsafe { self.0.read() }
}
fn try_lock_shared(&self) -> bool {
unsafe { self.0.try_read() }
}
unsafe fn unlock_shared(&self) {
self.0.read_unlock()
}
fn lock_exclusive(&self) {
unsafe { self.0.write() }
}
fn try_lock_exclusive(&self) -> bool {
unsafe { self.0.try_write() }
}
unsafe fn unlock_exclusive(&self) {
self.0.write_unlock()
}
}