summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/guard.rs16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/guard.rs b/src/guard.rs
index 9758e63..5f847d5 100644
--- a/src/guard.rs
+++ b/src/guard.rs
@@ -2,13 +2,15 @@ use std::ops::{Deref, DerefMut};
use crate::{lockable::Lockable, ThreadKey};
+/// A guard for a generic [`Lockable`] type.
pub struct LockGuard<'a, L: Lockable<'a>> {
guard: L::Output,
key: ThreadKey,
}
-// TODO: docs
impl<'a, L: Lockable<'a>> LockGuard<'a, L> {
+ /// Locks the lockable type and returns a guard that can be used to access
+ /// the underlying data.
pub fn lock(lock: &'a L, key: ThreadKey) -> Self {
Self {
// safety: we have the thread's key
@@ -17,11 +19,19 @@ impl<'a, L: Lockable<'a>> LockGuard<'a, L> {
}
}
- pub fn try_lock(lock: &'a L, key: ThreadKey) -> Option<Self> {
+ /// Attempts to lock the guard without blocking. If successful, this method
+ /// returns a guard that can be used to access the data. Otherwise, the key
+ /// is given back as an error.
+ pub fn try_lock(lock: &'a L, key: ThreadKey) -> Result<Self, ThreadKey> {
// safety: we have the thread's key
- unsafe { lock.try_lock() }.map(|guard| Self { guard, key })
+ match unsafe { lock.try_lock() } {
+ Some(guard) => Ok(Self { guard, key }),
+ None => Err(key),
+ }
}
+ /// Unlocks the underlying lockable data type, returning the key that's
+ /// associated with it.
#[allow(clippy::missing_const_for_fn)]
pub fn unlock(self) -> ThreadKey {
L::unlock(self.guard);