summaryrefslogtreecommitdiff
path: root/src/mutex/guard.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mutex/guard.rs')
-rw-r--r--src/mutex/guard.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/mutex/guard.rs b/src/mutex/guard.rs
new file mode 100644
index 0000000..b4005e1
--- /dev/null
+++ b/src/mutex/guard.rs
@@ -0,0 +1,39 @@
+use std::marker::PhantomData;
+use std::ops::{Deref, DerefMut};
+
+use lock_api::RawMutex;
+
+use crate::key::Keyable;
+
+use super::{Mutex, MutexGuard, MutexRef};
+
+impl<'a, 'key: 'a, T: ?Sized + 'a, Key: Keyable, R: RawMutex> Deref
+ for MutexGuard<'a, 'key, T, Key, R>
+{
+ type Target = T;
+
+ fn deref(&self) -> &Self::Target {
+ &self.mutex
+ }
+}
+
+impl<'a, 'key: 'a, T: ?Sized + 'a, Key: Keyable, R: RawMutex> DerefMut
+ for MutexGuard<'a, 'key, T, Key, R>
+{
+ fn deref_mut(&mut self) -> &mut Self::Target {
+ &mut self.mutex
+ }
+}
+
+impl<'a, 'key: 'a, T: ?Sized + 'a, Key: Keyable, R: RawMutex> MutexGuard<'a, 'key, T, Key, R> {
+ /// Create a guard to the given mutex. Undefined if multiple guards to the
+ /// same mutex exist at once.
+ #[must_use]
+ pub(super) const unsafe fn new(mutex: &'a Mutex<T, R>, thread_key: Key) -> Self {
+ Self {
+ mutex: MutexRef(mutex),
+ thread_key,
+ _phantom: PhantomData,
+ }
+ }
+}