use super::Lock;
pub type Mutex<T> = lock_api::Mutex<Lock, T>;
#[inline]
pub async fn lock_async<T>(mutex: &Mutex<T>) -> MutexGuard<'_, T> {
unsafe {
mutex.raw().lock_async().await;
mutex.make_guard_unchecked()
}
}
pub type MutexGuard<'a, T> = lock_api::MutexGuard<'a, Lock, T>;
pub type RwLock<T> = lock_api::RwLock<Lock, T>;
pub type RwLockReadGuard<'a, T> = lock_api::RwLockReadGuard<'a, Lock, T>;
#[inline]
pub async fn read_async<T>(rwlock: &RwLock<T>) -> RwLockReadGuard<'_, T> {
unsafe {
rwlock.raw().share_async().await;
rwlock.make_read_guard_unchecked()
}
}
pub type RwLockWriteGuard<'a, T> = lock_api::RwLockWriteGuard<'a, Lock, T>;
#[inline]
pub async fn write_async<T>(rwlock: &RwLock<T>) -> RwLockWriteGuard<'_, T> {
unsafe {
rwlock.raw().lock_async().await;
rwlock.make_write_guard_unchecked()
}
}
unsafe impl lock_api::RawMutex for Lock {
const INIT: Self = Lock::new();
type GuardMarker = lock_api::GuardSend;
#[inline]
fn lock(&self) {
self.lock_sync();
}
#[inline]
fn try_lock(&self) -> bool {
self.try_lock()
}
#[inline]
unsafe fn unlock(&self) {
self.release_lock();
}
}
unsafe impl lock_api::RawMutexFair for Lock {
#[inline]
unsafe fn unlock_fair(&self) {
self.release_lock();
}
}
unsafe impl lock_api::RawRwLock for Lock {
const INIT: Self = Lock::new();
type GuardMarker = lock_api::GuardSend;
#[inline]
fn lock_shared(&self) {
self.share_sync();
}
#[inline]
fn try_lock_shared(&self) -> bool {
self.try_share()
}
#[inline]
unsafe fn unlock_shared(&self) {
self.release_share();
}
#[inline]
fn lock_exclusive(&self) {
self.lock_sync();
}
#[inline]
fn try_lock_exclusive(&self) -> bool {
self.try_lock()
}
#[inline]
unsafe fn unlock_exclusive(&self) {
self.release_lock();
}
}
unsafe impl lock_api::RawRwLockFair for Lock {
#[inline]
unsafe fn unlock_shared_fair(&self) {
self.release_share();
}
#[inline]
unsafe fn unlock_exclusive_fair(&self) {
self.release_lock();
}
}