diff options
Diffstat (limited to 'rust/kernel/sync')
| -rw-r--r-- | rust/kernel/sync/locked_by.rs | 18 | 
1 files changed, 14 insertions, 4 deletions
| diff --git a/rust/kernel/sync/locked_by.rs b/rust/kernel/sync/locked_by.rs index babc731bd5f6..ce2ee8d87865 100644 --- a/rust/kernel/sync/locked_by.rs +++ b/rust/kernel/sync/locked_by.rs @@ -83,8 +83,12 @@ pub struct LockedBy<T: ?Sized, U: ?Sized> {  // SAFETY: `LockedBy` can be transferred across thread boundaries iff the data it protects can.  unsafe impl<T: ?Sized + Send, U: ?Sized> Send for LockedBy<T, U> {} -// SAFETY: `LockedBy` serialises the interior mutability it provides, so it is `Sync` as long as the -// data it protects is `Send`. +// SAFETY: If `T` is not `Sync`, then parallel shared access to this `LockedBy` allows you to use +// `access_mut` to hand out `&mut T` on one thread at the time. The requirement that `T: Send` is +// sufficient to allow that. +// +// If `T` is `Sync`, then the `access` method also becomes available, which allows you to obtain +// several `&T` from several threads at once. However, this is okay as `T` is `Sync`.  unsafe impl<T: ?Sized + Send, U: ?Sized> Sync for LockedBy<T, U> {}  impl<T, U> LockedBy<T, U> { @@ -118,7 +122,10 @@ impl<T: ?Sized, U> LockedBy<T, U> {      ///      /// Panics if `owner` is different from the data protected by the lock used in      /// [`new`](LockedBy::new). -    pub fn access<'a>(&'a self, owner: &'a U) -> &'a T { +    pub fn access<'a>(&'a self, owner: &'a U) -> &'a T +    where +        T: Sync, +    {          build_assert!(              size_of::<U>() > 0,              "`U` cannot be a ZST because `owner` wouldn't be unique" @@ -127,7 +134,10 @@ impl<T: ?Sized, U> LockedBy<T, U> {              panic!("mismatched owners");          } -        // SAFETY: `owner` is evidence that the owner is locked. +        // SAFETY: `owner` is evidence that there are only shared references to the owner for the +        // duration of 'a, so it's not possible to use `Self::access_mut` to obtain a mutable +        // reference to the inner value that aliases with this shared reference. The type is `Sync` +        // so there are no other requirements.          unsafe { &*self.data.get() }      } | 
