From 8ea16a606bfcc1ba535f6cef3cb4c162f91d2eb0 Mon Sep 17 00:00:00 2001 From: Mica White Date: Sat, 9 Mar 2024 14:48:25 -0500 Subject: RwLock --- src/lockable.rs | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) (limited to 'src/lockable.rs') 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 {} + impl<'a, T, R: RawRwLock + 'a> Sealed for RwLock {} + 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 Sealed for &T {} impl 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 { } } +unsafe impl<'a, T: 'a, R: RawRwLock + 'a> Lockable<'a> for RwLock { + 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.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.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.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,); -- cgit v1.2.3