summaryrefslogtreecommitdiff
path: root/src/rwlock
diff options
context:
space:
mode:
authorMica White <botahamec@outlook.com>2024-03-13 22:44:46 -0400
committerMica White <botahamec@outlook.com>2024-03-13 22:44:46 -0400
commit7bd236853ef5ae705328c8fdc492cf60fc6887c1 (patch)
treeec4e9dced562fdae618b98ac704074c0ddc9cc41 /src/rwlock
parent7c6f49b6570669098938dc332a4f3e85dd3d217d (diff)
Lockable overhaul
Diffstat (limited to 'src/rwlock')
-rw-r--r--src/rwlock/read_guard.rs6
-rw-r--r--src/rwlock/read_lock.rs6
-rw-r--r--src/rwlock/rwlock.rs32
-rw-r--r--src/rwlock/write_guard.rs6
-rw-r--r--src/rwlock/write_lock.rs6
5 files changed, 26 insertions, 30 deletions
diff --git a/src/rwlock/read_guard.rs b/src/rwlock/read_guard.rs
index 532a6e7..8428987 100644
--- a/src/rwlock/read_guard.rs
+++ b/src/rwlock/read_guard.rs
@@ -26,6 +26,12 @@ impl<'a, T: ?Sized + 'a, R: RawRwLock> Drop for RwLockReadRef<'a, T, R> {
}
}
+impl<'a, T: ?Sized + 'a, R: RawRwLock> RwLockReadRef<'a, T, R> {
+ pub unsafe fn new(mutex: &'a RwLock<T, R>) -> Self {
+ Self(mutex, PhantomData)
+ }
+}
+
impl<'a, 'key: 'a, T: ?Sized + 'a, Key: Keyable, R: RawRwLock> Deref
for RwLockReadGuard<'a, 'key, T, Key, R>
{
diff --git a/src/rwlock/read_lock.rs b/src/rwlock/read_lock.rs
index 176fc01..133ca7d 100644
--- a/src/rwlock/read_lock.rs
+++ b/src/rwlock/read_lock.rs
@@ -67,12 +67,6 @@ impl<'a, T: ?Sized, R: RawRwLock> ReadLock<'a, T, R> {
self.0.read(key)
}
- /// Creates a shared lock without a key. Locking this without exclusive
- /// access to the key is undefined behavior.
- pub(crate) unsafe fn lock_no_key(&self) -> RwLockReadRef<'_, T, R> {
- self.0.read_no_key()
- }
-
/// Attempts to acquire the underlying [`RwLock`] with shared read access
/// without blocking.
pub fn try_lock<'s, 'key: 's, Key: Keyable + 'key>(
diff --git a/src/rwlock/rwlock.rs b/src/rwlock/rwlock.rs
index dc5ab30..d16befe 100644
--- a/src/rwlock/rwlock.rs
+++ b/src/rwlock/rwlock.rs
@@ -24,6 +24,20 @@ impl<T, R: RawRwLock> RwLock<T, R> {
raw: R::INIT,
}
}
+
+ /// Returns the underlying raw reader-writer lock object.
+ ///
+ /// Note that you will most likely need to import the [`RawRwLock`] trait
+ /// from `lock_api` to be able to call functions on the raw reader-writer
+ /// lock.
+ ///
+ /// # Safety
+ ///
+ /// This method is unsafe because it allows unlocking a mutex while
+ /// still holding a reference to a lock guard.
+ pub const unsafe fn raw(&self) -> &R {
+ &self.raw
+ }
}
impl<T: ?Sized + Default, R: RawRwLock> Default for RwLock<T, R> {
@@ -155,15 +169,6 @@ impl<T: ?Sized, R: RawRwLock> RwLock<T, R> {
}
}
- /// Creates a shared lock without a key. Locking this without exclusive
- /// access to the key is undefined behavior.
- pub(crate) unsafe fn read_no_key(&self) -> RwLockReadRef<'_, T, R> {
- self.raw.lock_shared();
-
- // safety: the lock is locked first
- RwLockReadRef(self, PhantomData)
- }
-
/// Attempts to acquire this `RwLock` with shared read access without
/// blocking.
///
@@ -246,15 +251,6 @@ impl<T: ?Sized, R: RawRwLock> RwLock<T, R> {
}
}
- /// Creates an exclusive lock without a key. Locking this without exclusive
- /// access to the key is undefined behavior.
- pub(crate) unsafe fn write_no_key(&self) -> RwLockWriteRef<'_, T, R> {
- self.raw.lock_exclusive();
-
- // safety: the lock is locked first
- RwLockWriteRef(self, PhantomData)
- }
-
/// Attempts to lock this `RwLock` with exclusive write access.
///
/// This function does not block. If the lock could not be acquired at this
diff --git a/src/rwlock/write_guard.rs b/src/rwlock/write_guard.rs
index 6549822..16b474e 100644
--- a/src/rwlock/write_guard.rs
+++ b/src/rwlock/write_guard.rs
@@ -35,6 +35,12 @@ impl<'a, T: ?Sized + 'a, R: RawRwLock> Drop for RwLockWriteRef<'a, T, R> {
}
}
+impl<'a, T: ?Sized + 'a, R: RawRwLock> RwLockWriteRef<'a, T, R> {
+ pub unsafe fn new(mutex: &'a RwLock<T, R>) -> Self {
+ Self(mutex, PhantomData)
+ }
+}
+
impl<'a, 'key: 'a, T: ?Sized + 'a, Key: Keyable, R: RawRwLock> Deref
for RwLockWriteGuard<'a, 'key, T, Key, R>
{
diff --git a/src/rwlock/write_lock.rs b/src/rwlock/write_lock.rs
index d7333ae..c6b4c24 100644
--- a/src/rwlock/write_lock.rs
+++ b/src/rwlock/write_lock.rs
@@ -67,12 +67,6 @@ impl<'a, T: ?Sized, R: RawRwLock> WriteLock<'a, T, R> {
self.0.write(key)
}
- /// Creates an exclusive lock without a key. Locking this without exclusive
- /// access to the key is undefined behavior.
- pub(crate) unsafe fn lock_no_key(&self) -> RwLockWriteRef<'_, T, R> {
- self.0.write_no_key()
- }
-
/// Attempts to lock the underlying [`RwLock`] with exclusive write access.
pub fn try_lock<'s, 'key: 's, Key: Keyable + 'key>(
&'s self,