summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/guard.rs35
1 files changed, 28 insertions, 7 deletions
diff --git a/src/guard.rs b/src/guard.rs
index 5e29966..d9e8426 100644
--- a/src/guard.rs
+++ b/src/guard.rs
@@ -10,8 +10,11 @@ mod sealed {
use super::*;
pub trait Sealed {}
impl<'a, T, R: RawMutex + 'a> Sealed for Mutex<T, R> {}
- impl<'a, T, R: RawMutex + 'a> Sealed for &Mutex<T, R> {}
+ impl<T: Sealed> Sealed for &T {}
+ impl<T: Sealed> Sealed for &mut T {}
impl<'a, A: Lockable<'a>, B: Lockable<'a>> Sealed for (A, B) {}
+ impl<'a, T: Lockable<'a>, const N: usize> Sealed for [T; N] {}
+ impl<'a, T: Lockable<'a>> Sealed for &[T] {}
}
pub trait Lockable<'a>: sealed::Sealed {
@@ -42,23 +45,41 @@ pub trait Lockable<'a>: sealed::Sealed {
fn unlock(guard: Self::Output);
}
-impl<'a, T: 'a, R: RawMutex + 'a> Lockable<'a> for Mutex<T, R> {
- type Output = MutexRef<'a, T, R>;
+impl<'a, T: Lockable<'a>> Lockable<'a> for &T {
+ type Output = T::Output;
unsafe fn lock(&'a self) -> Self::Output {
- self.lock_ref()
+ (*self).lock()
}
unsafe fn try_lock(&'a self) -> Option<Self::Output> {
- self.try_lock_ref()
+ (*self).try_lock()
}
+ #[allow(clippy::semicolon_if_nothing_returned)]
fn unlock(guard: Self::Output) {
- drop(guard);
+ T::unlock(guard)
}
}
-impl<'a, T: 'a, R: RawMutex + 'a> Lockable<'a> for &Mutex<T, R> {
+impl<'a, T: Lockable<'a>> Lockable<'a> for &mut T {
+ type Output = T::Output;
+
+ unsafe fn lock(&'a self) -> Self::Output {
+ (**self).lock()
+ }
+
+ unsafe fn try_lock(&'a self) -> Option<Self::Output> {
+ (**self).try_lock()
+ }
+
+ #[allow(clippy::semicolon_if_nothing_returned)]
+ fn unlock(guard: Self::Output) {
+ T::unlock(guard)
+ }
+}
+
+impl<'a, T: 'a, R: RawMutex + 'a> Lockable<'a> for Mutex<T, R> {
type Output = MutexRef<'a, T, R>;
unsafe fn lock(&'a self) -> Self::Output {