summaryrefslogtreecommitdiff
path: root/src/lockable.rs
diff options
context:
space:
mode:
authorMica White <botahamec@outlook.com>2024-03-09 14:48:25 -0500
committerMica White <botahamec@outlook.com>2024-03-09 14:48:25 -0500
commit8ea16a606bfcc1ba535f6cef3cb4c162f91d2eb0 (patch)
tree0538a9de40fb0129952981df3b9c3084667bb90c /src/lockable.rs
parentcc96e2ce5875e8e5c28a9ede3c30b833b0bce225 (diff)
RwLock
Diffstat (limited to 'src/lockable.rs')
-rw-r--r--src/lockable.rs59
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,);