On Mon Dec 15, 2025 at 6:58 PM CET, Lyude Paul wrote:
> Now that we have the ability to provide an explicit lifetime for a
> GlobalGuard and an explicit Backend for a GlobalGuard, we can finally
> implement lock_with() and try_lock_with().
>
> Signed-off-by: Lyude Paul <lyude@redhat.com>
> ---
> rust/kernel/sync/lock/global.rs | 28 ++++++++++++++++++++++++++++
> 1 file changed, 28 insertions(+)
>
> diff --git a/rust/kernel/sync/lock/global.rs b/rust/kernel/sync/lock/global.rs
> index 64fc7e7a4b282..7aee9b25baefc 100644
> --- a/rust/kernel/sync/lock/global.rs
> +++ b/rust/kernel/sync/lock/global.rs
> @@ -89,6 +89,34 @@ pub fn try_lock(&'static self) -> Option<GlobalGuard<'static, G, G::Backend>> {
> inner: self.inner.try_lock()?,
> })
> }
> +
> + /// Lock this global lock with the provided `context`.
> + pub fn lock_with<'a, B>(
> + &'static self,
> + context: <G::Backend as Backend>::Context<'a>,
> + ) -> GlobalGuard<'a, G, B>
> + where
> + G::Backend: Backend<BackendInContext = B>,
> + B: Backend,
Since `BackendInContext` is an associated type, you don't need this type
parameter and can write instead:
pub fn lock_with<'a>(
&'static self,
context: <G::Backend as Backend>::Context<'a>,
) -> GlobalGuard<'a, G, <G::Backend as Backend>::BackendInContext>
where
<G::Backend as Backend>::BackendInContext: Backend,
Cheers,
Benno
> + {
> + GlobalGuard {
> + inner: self.inner.lock_with(context),
> + }
> + }
> +
> + /// Try to lock this global lock with the provided `context`.
> + pub fn try_lock_with<'a, B>(
> + &'static self,
> + context: <G::Backend as Backend>::Context<'a>,
> + ) -> Option<GlobalGuard<'a, G, B>>
> + where
> + G::Backend: Backend<BackendInContext = B>,
> + B: Backend,
> + {
> + Some(GlobalGuard {
> + inner: self.inner.try_lock_with(context)?,
> + })
> + }
> }
>
> /// A guard for a [`GlobalLock`].