diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/guard.rs | 16 |
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); |
