From fe67aa262f1b04fb6c38683d9221c3a2fafcc35a Mon Sep 17 00:00:00 2001 From: Mica White Date: Sun, 10 Mar 2024 20:21:00 -0400 Subject: Reorganization --- src/mutex/mutex_ref.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/mutex/mutex_ref.rs (limited to 'src/mutex/mutex_ref.rs') diff --git a/src/mutex/mutex_ref.rs b/src/mutex/mutex_ref.rs new file mode 100644 index 0000000..5222719 --- /dev/null +++ b/src/mutex/mutex_ref.rs @@ -0,0 +1,33 @@ +use std::ops::{Deref, DerefMut}; + +use lock_api::RawMutex; + +use super::MutexRef; + +impl<'a, T: ?Sized + 'a, R: RawMutex> Drop for MutexRef<'a, T, R> { + fn drop(&mut self) { + // safety: this guard is being destroyed, so the data cannot be + // accessed without locking again + unsafe { self.0.force_unlock() } + } +} + +impl<'a, T: ?Sized + 'a, R: RawMutex> Deref for MutexRef<'a, T, R> { + type Target = T; + + fn deref(&self) -> &Self::Target { + // safety: this is the only type that can use `value`, and there's + // a reference to this type, so there cannot be any mutable + // references to this value. + unsafe { &*self.0.value.get() } + } +} + +impl<'a, T: ?Sized + 'a, R: RawMutex> DerefMut for MutexRef<'a, T, R> { + fn deref_mut(&mut self) -> &mut Self::Target { + // safety: this is the only type that can use `value`, and we have a + // mutable reference to this type, so there cannot be any other + // references to this value. + unsafe { &mut *self.0.value.get() } + } +} -- cgit v1.2.3