diff options
author | 2022-12-28 06:03:44 +0000 | |
---|---|---|
committer | 2023-01-16 23:48:06 +0100 | |
commit | 92a655ae00a2f15fdd80eb96cd23526c0d8f0bfd (patch) | |
tree | bac7f9afdccd7558455d1f52e8be94c0eec12cec /rust/kernel/sync | |
parent | rust: sync: introduce `ArcBorrow` (diff) | |
download | linux-92a655ae00a2f15fdd80eb96cd23526c0d8f0bfd.tar.gz linux-92a655ae00a2f15fdd80eb96cd23526c0d8f0bfd.tar.bz2 linux-92a655ae00a2f15fdd80eb96cd23526c0d8f0bfd.zip |
rust: sync: allow type of `self` to be `ArcBorrow<T>`
This allows associated functions whose `self` argument has
`ArcBorrow<T>` as their type. This, in turn, allows callers to use the
dot syntax to make calls.
Signed-off-by: Wedson Almeida Filho <wedsonaf@gmail.com>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Gary Guo <gary@garyguo.net>
Reviewed-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
Acked-by: Boqun Feng <boqun.feng@gmail.com>
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
Diffstat (limited to 'rust/kernel/sync')
-rw-r--r-- | rust/kernel/sync/arc.rs | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs index f68bfc02c81a..84f31c85a513 100644 --- a/rust/kernel/sync/arc.rs +++ b/rust/kernel/sync/arc.rs @@ -255,11 +255,34 @@ impl<T: ?Sized> Drop for Arc<T> { /// // Assert that both `obj` and `cloned` point to the same underlying object. /// assert!(core::ptr::eq(&*obj, &*cloned)); /// ``` +/// +/// Using `ArcBorrow<T>` as the type of `self`: +/// +/// ``` +/// use crate::sync::{Arc, ArcBorrow}; +/// +/// struct Example { +/// a: u32, +/// b: u32, +/// } +/// +/// impl Example { +/// fn use_reference(self: ArcBorrow<'_, Self>) { +/// // ... +/// } +/// } +/// +/// let obj = Arc::try_new(Example { a: 10, b: 20 })?; +/// obj.as_arc_borrow().use_reference(); +/// ``` pub struct ArcBorrow<'a, T: ?Sized + 'a> { inner: NonNull<ArcInner<T>>, _p: PhantomData<&'a ()>, } +// This is to allow [`ArcBorrow`] (and variants) to be used as the type of `self`. +impl<T: ?Sized> core::ops::Receiver for ArcBorrow<'_, T> {} + impl<T: ?Sized> Clone for ArcBorrow<'_, T> { fn clone(&self) -> Self { *self |