summaryrefslogtreecommitdiff
path: root/src/rwlock/read_guard.rs
diff options
context:
space:
mode:
authorMica White <botahamec@outlook.com>2024-03-10 20:21:00 -0400
committerMica White <botahamec@outlook.com>2024-03-10 20:21:00 -0400
commitfe67aa262f1b04fb6c38683d9221c3a2fafcc35a (patch)
tree91366e032219f5e29ff4ba993598ae581aefa829 /src/rwlock/read_guard.rs
parente8d25c9e6e7d5c3a5a14219fc77ea98760cef790 (diff)
Reorganization
Diffstat (limited to 'src/rwlock/read_guard.rs')
-rw-r--r--src/rwlock/read_guard.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/rwlock/read_guard.rs b/src/rwlock/read_guard.rs
new file mode 100644
index 0000000..e967420
--- /dev/null
+++ b/src/rwlock/read_guard.rs
@@ -0,0 +1,52 @@
+use std::marker::PhantomData;
+use std::ops::Deref;
+
+use lock_api::RawRwLock;
+
+use crate::key::Keyable;
+
+use super::{RwLock, RwLockReadGuard, RwLockReadRef};
+
+impl<'a, T: ?Sized + 'a, R: RawRwLock> Deref for RwLockReadRef<'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: RawRwLock> Drop for RwLockReadRef<'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_read() }
+ }
+}
+
+impl<'a, 'key: 'a, T: ?Sized + 'a, Key: Keyable, R: RawRwLock> Deref
+ for RwLockReadGuard<'a, 'key, T, Key, R>
+{
+ type Target = T;
+
+ fn deref(&self) -> &Self::Target {
+ &self.rwlock
+ }
+}
+
+impl<'a, 'key: 'a, T: ?Sized + 'a, Key: Keyable, R: RawRwLock>
+ RwLockReadGuard<'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(rwlock: &'a RwLock<T, R>, thread_key: Key) -> Self {
+ Self {
+ rwlock: RwLockReadRef(rwlock),
+ thread_key,
+ _phantom: PhantomData,
+ }
+ }
+}