Hello, Alexandre, On Tue, 15 Apr 2025 04:37:01 GMT, Alexandre Courbot wrote: > Revocable::try_access() returns a guard through which the wrapped object > can be accessed. Code that can sleep is not allowed while the guard is > held; thus, it is common for the caller to explicitly drop it before > running sleepable code, e.g: > > let b = bar.try_access()?; > let reg = b.readl(...); > > // Don't forget this or things could go wrong! > drop(b); > > something_that_might_sleep(); > > let b = bar.try_access()?; > let reg2 = b.readl(...); > > This is arguably error-prone. try_access_with() provides an arguably > safer alternative, by taking a closure that is run while the guard is > held, and by dropping the guard automatically after the closure > completes. This way, code can be organized more clearly around the > critical sections and the risk of forgetting to release the guard when > needed is considerably reduced: > > let reg = bar.try_access_with(|b| b.readl(...))?; > > something_that_might_sleep(); > > let reg2 = bar.try_access_with(|b| b.readl(...))?; > > The closure can return nothing, or any value including a Result which is > then wrapped inside the Option returned by try_access_with. Error > management is driver-specific, so users are encouraged to create their > own macros that map and flatten the returned values to something > appropriate for the code they are working on. > > Acked-by: Danilo Krummrich <dakr@xxxxxxxxxx> > Suggested-by: Danilo Krummrich <dakr@xxxxxxxxxx> > Reviewed-by: Benno Lossin <benno.lossin@xxxxxxxxx> > Signed-off-by: Alexandre Courbot <acourbot@xxxxxxxxxx> Reviewed-by: Joel Fernandes <joelagnelf@xxxxxxxxxx> Thanks.