[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <aAcesqWolkxw4V8D@Mac.home>
Date: Mon, 21 Apr 2025 21:44:34 -0700
From: Boqun Feng <boqun.feng@...il.com>
To: Benno Lossin <benno.lossin@...ton.me>
Cc: Miguel Ojeda <ojeda@...nel.org>, Alex Gaynor <alex.gaynor@...il.com>,
Gary Guo <gary@...yguo.net>,
Björn Roy Baron <bjorn3_gh@...tonmail.com>,
Andreas Hindborg <a.hindborg@...nel.org>,
Alice Ryhl <aliceryhl@...gle.com>, Trevor Gross <tmgross@...ch.edu>,
Danilo Krummrich <dakr@...nel.org>, Fiona Behrens <me@...enk.dev>,
Christian Schrefl <chrisi.schrefl@...il.com>,
rust-for-linux@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH 2/8] rust: pin-init: Add the `Wrapper` trait.
On Mon, Apr 21, 2025 at 10:17:59PM +0000, Benno Lossin wrote:
> From: Christian Schrefl <chrisi.schrefl@...il.com>
>
> This trait allows creating `PinInitializers` for wrapper or new-type
> structs with the inner value structurally pinned, when given the
> initializer for the inner value.
>
> Implement this trait for `UnsafeCell` and `MaybeUninit`.
>
> Signed-off-by: Christian Schrefl <chrisi.schrefl@...il.com>
> Link: https://github.com/Rust-for-Linux/pin-init/pull/37/commits/3ab4db083bd7b41a1bc23d937224f975d7400e50
> [ Reworded commit message into imperative mode, fixed typo and fixed
> commit authorship. - Benno ]
> Signed-off-by: Benno Lossin <benno.lossin@...ton.me>
> ---
> rust/pin-init/src/lib.rs | 44 ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 44 insertions(+)
>
> diff --git a/rust/pin-init/src/lib.rs b/rust/pin-init/src/lib.rs
> index a880c21d3f09..467ccc8bd616 100644
> --- a/rust/pin-init/src/lib.rs
> +++ b/rust/pin-init/src/lib.rs
> @@ -1513,3 +1513,47 @@ unsafe impl<$first: Zeroable, $($t: Zeroable),*> Zeroable for ($first, $($t),*)
> }
>
> impl_tuple_zeroable!(A, B, C, D, E, F, G, H, I, J);
> +
> +/// This trait allows creating an instance of `Self` which contains exactly one
> +/// [structurally pinned value](https://doc.rust-lang.org/std/pin/index.html#projections-and-structural-pinning).
> +///
> +/// This is useful when using wrapper `struct`s like [`UnsafeCell`] or with new-type `struct`s.
> +///
> +/// # Examples
> +///
> +/// ```
> +/// # use core::cell::UnsafeCell;
> +/// # use pin_init::{pin_data, pin_init, Wrapper};
> +///
> +/// #[pin_data]
> +/// struct Foo {}
> +///
> +/// #[pin_data]
> +/// struct Bar {
> +/// #[pin]
> +/// content: UnsafeCell<Foo>
> +/// };
> +///
> +/// let foo_initializer = pin_init!(Foo{});
> +/// let initializer = pin_init!(Bar {
> +/// content <- UnsafeCell::pin_init(foo_initializer)
> +/// });
> +/// ```
> +pub trait Wrapper<T> {
> + /// Create an pin-initializer for a [`Self`] containing `T` form the `value_init` initializer.
s/Create/Creates ?
and
s/form/from ?
Regards,
Boqun
> + fn pin_init<E>(value_init: impl PinInit<T, E>) -> impl PinInit<Self, E>;
> +}
> +
> +impl<T> Wrapper<T> for UnsafeCell<T> {
> + fn pin_init<E>(value_init: impl PinInit<T, E>) -> impl PinInit<Self, E> {
> + // SAFETY: `UnsafeCell<T>` has a compatible layout to `T`.
> + unsafe { cast_pin_init(value_init) }
> + }
> +}
> +
> +impl<T> Wrapper<T> for MaybeUninit<T> {
> + fn pin_init<E>(value_init: impl PinInit<T, E>) -> impl PinInit<Self, E> {
> + // SAFETY: `MaybeUninit<T>` has a compatible layout to `T`.
> + unsafe { cast_pin_init(value_init) }
> + }
> +}
> --
> 2.48.1
>
>
Powered by blists - more mailing lists