diff options
| author | Mica White <botahamec@outlook.com> | 2024-03-09 14:48:25 -0500 |
|---|---|---|
| committer | Mica White <botahamec@outlook.com> | 2024-03-09 14:48:25 -0500 |
| commit | 8ea16a606bfcc1ba535f6cef3cb4c162f91d2eb0 (patch) | |
| tree | 0538a9de40fb0129952981df3b9c3084667bb90c /src/lockable.rs | |
| parent | cc96e2ce5875e8e5c28a9ede3c30b833b0bce225 (diff) | |
RwLock
Diffstat (limited to 'src/lockable.rs')
| -rw-r--r-- | src/lockable.rs | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/src/lockable.rs b/src/lockable.rs index 4271fc8..050f856 100644 --- a/src/lockable.rs +++ b/src/lockable.rs @@ -1,7 +1,11 @@ use std::mem::MaybeUninit; -use crate::mutex::{Mutex, MutexRef}; -use lock_api::RawMutex; +use crate::{ + mutex::{Mutex, MutexRef}, + rwlock::{ReadLock, RwLock, RwLockReadRef, RwLockWriteRef, WriteLock}, +}; + +use lock_api::{RawMutex, RawRwLock}; mod sealed { use super::Lockable as L; @@ -10,6 +14,9 @@ mod sealed { pub trait Sealed {} impl<'a, T, R: RawMutex + 'a> Sealed for Mutex<T, R> {} + impl<'a, T, R: RawRwLock + 'a> Sealed for RwLock<T, R> {} + impl<'a, T, R: RawRwLock + 'a> Sealed for ReadLock<'a, T, R> {} + impl<'a, T, R: RawRwLock + 'a> Sealed for WriteLock<'a, T, R> {} impl<T: Sealed> Sealed for &T {} impl<T: Sealed> Sealed for &mut T {} impl<'a, A: L<'a>> Sealed for (A,) {} @@ -111,6 +118,54 @@ unsafe impl<'a, T: 'a, R: RawMutex + 'a> Lockable<'a> for Mutex<T, R> { } } +unsafe impl<'a, T: 'a, R: RawRwLock + 'a> Lockable<'a> for RwLock<T, R> { + type Output = RwLockWriteRef<'a, T, R>; + + unsafe fn lock(&'a self) -> Self::Output { + self.write_no_key() + } + + unsafe fn try_lock(&'a self) -> Option<Self::Output> { + self.try_write_no_key() + } + + fn unlock(guard: Self::Output) { + drop(guard); + } +} + +unsafe impl<'a, T: 'a, R: RawRwLock + 'a> Lockable<'a> for ReadLock<'a, T, R> { + type Output = RwLockReadRef<'a, T, R>; + + unsafe fn lock(&'a self) -> Self::Output { + self.lock_no_key() + } + + unsafe fn try_lock(&'a self) -> Option<Self::Output> { + self.try_lock_no_key() + } + + fn unlock(guard: Self::Output) { + drop(guard); + } +} + +unsafe impl<'a, T: 'a, R: RawRwLock + 'a> Lockable<'a> for WriteLock<'a, T, R> { + type Output = RwLockWriteRef<'a, T, R>; + + unsafe fn lock(&'a self) -> Self::Output { + self.lock_no_key() + } + + unsafe fn try_lock(&'a self) -> Option<Self::Output> { + self.try_lock_no_key() + } + + fn unlock(guard: Self::Output) { + drop(guard); + } +} + unsafe impl<'a, A: Lockable<'a>> Lockable<'a> for (A,) { type Output = (A::Output,); |
