diff options
Diffstat (limited to 'rust/kernel/revocable.rs')
| -rw-r--r-- | rust/kernel/revocable.rs | 28 | 
1 files changed, 28 insertions, 0 deletions
| diff --git a/rust/kernel/revocable.rs b/rust/kernel/revocable.rs index 1e5a9d25c21b..db4aa46bb121 100644 --- a/rust/kernel/revocable.rs +++ b/rust/kernel/revocable.rs @@ -123,6 +123,34 @@ impl<T> Revocable<T> {          }      } +    /// Tries to access the wrapped object and run a closure on it while the guard is held. +    /// +    /// This is a convenience method to run short non-sleepable code blocks while ensuring the +    /// guard is dropped afterwards. [`Self::try_access`] carries the risk that the caller will +    /// forget to explicitly drop that returned guard before calling sleepable code; this method +    /// adds an extra safety to make sure it doesn't happen. +    /// +    /// Returns [`None`] if the object has been revoked and is therefore no longer accessible, or +    /// the result of the closure wrapped in [`Some`]. If the closure returns a [`Result`] then the +    /// return type becomes `Option<Result<>>`, which can be inconvenient. Users are encouraged to +    /// define their own macro that turns the [`Option`] into a proper error code and flattens the +    /// inner result into it if it makes sense within their subsystem. +    pub fn try_access_with<R, F: FnOnce(&T) -> R>(&self, f: F) -> Option<R> { +        self.try_access().map(|t| f(&*t)) +    } + +    /// Directly access the revocable wrapped object. +    /// +    /// # Safety +    /// +    /// The caller must ensure this [`Revocable`] instance hasn't been revoked and won't be revoked +    /// as long as the returned `&T` lives. +    pub unsafe fn access(&self) -> &T { +        // SAFETY: By the safety requirement of this function it is guaranteed that +        // `self.data.get()` is a valid pointer to an instance of `T`. +        unsafe { &*self.data.get() } +    } +      /// # Safety      ///      /// Callers must ensure that there are no more concurrent users of the revocable object. | 
