From: Alice Ryhl <alice@ryhl.io>
To: Benno Lossin <y86-dev@protonmail.com>
Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
patches@lists.linux.dev, "Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Wedson Almeida Filho" <wedsonaf@gmail.com>,
"Boqun Feng" <boqun.feng@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>
Subject: Re: [PATCH v3 06/13] rust: init/sync: add `InPlaceInit` trait to pin-initialize smart pointers
Date: Thu, 30 Mar 2023 22:24:53 +0200 [thread overview]
Message-ID: <1c2338c5-adab-f85c-645e-44e361ef0677@ryhl.io> (raw)
In-Reply-To: <3ea5cd8d-84ca-59bd-de50-fef185233a50@protonmail.com>
On 3/30/23 17:28, Benno Lossin wrote:
> On 30.03.23 16:37, Alice Ryhl wrote:
>> On 3/30/23 00:33, y86-dev@protonmail.com wrote:
>>> From: Benno Lossin <y86-dev@protonmail.com>
>>>
>>> The `InPlaceInit` trait that provides two functions, for initializing
>>> using `PinInit<T, E>` and `Init<T>`. It is implemented by `Arc<T>`,
>>> `UniqueArc<T>` and `Box<T>`.
>>>
>>> Signed-off-by: Benno Lossin <y86-dev@protonmail.com>
>>> ---
>>>
>>> +/// Smart pointer that can initialize memory in-place.
>>> +pub trait InPlaceInit<T>: Sized {
>>> + /// Use the given initializer to in-place initialize a `T`.
>>> + ///
>>> + /// If `T: !Unpin` it will not be able to move afterwards.
>>> + fn pin_init<E>(init: impl PinInit<T, E>) -> error::Result<Pin<Self>>
>>> + where
>>> + Error: From<E>;
>>> +
>>> + /// Use the given initializer to in-place initialize a `T`.
>>> + fn init<E>(init: impl Init<T, E>) -> error::Result<Self>
>>> + where
>>> + Error: From<E>;
>>> +}
>>
>> This definition is potentially rather limiting, because it can only be
>> used with error types that can be converted into a `kernel::Error`. What
>> do you think of this alternative?
>>
>> pub trait InPlaceInit<T>: Sized {
>> fn pin_init<E>(init: impl PinInit<T, E>) -> Result<Pin<Self>, E>
>> where
>> E: From<AllocError>;
>>
>> fn init<E>(init: impl Init<T, E>) -> Result<Self, E>
>> where
>> E: From<AllocError>;
>> }
>
> I initially implemented it like this, but it required almost always that
> `E` is specified, I will try and see if the situation is any different now,
> but I do not think so. In the user-space version of this API (see [1]) I
> have four functions, normal variants that return an `AllocError` and `try`
> variants that look exactly like what you suggested. In the kernel, we could
> make the normal variants as they are now and add the `try` variants as you
> described.
>
> [1]: https://docs.rs/pinned-init/0.0.5/pinned_init/trait.InPlaceInit.html
>
> --
> Cheers,
> Benno
Ok, if my alternative causes type inference problems, then let us keep
the version you proposed here. We can add more variants later. (Or if
you want to add more now, that's also fine.)
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
next prev parent reply other threads:[~2023-03-30 20:25 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-29 22:32 [PATCH v3 00/13] Rust pin-init API for pinned initialization of structs y86-dev
2023-03-29 22:32 ` [PATCH v3 01/13] rust: macros: add `quote!` macro y86-dev
2023-03-30 11:42 ` Andreas Hindborg
2023-03-30 12:01 ` Andreas Hindborg
2023-03-30 13:11 ` Gary Guo
2023-03-30 13:33 ` Alice Ryhl
2023-03-31 10:43 ` Andreas Hindborg
2023-03-29 22:32 ` [PATCH v3 02/13] rust: sync: add `assume_init` to `UniqueArc` y86-dev
2023-03-30 4:13 ` Wedson Almeida Filho
2023-03-30 12:18 ` Andreas Hindborg
2023-03-30 13:33 ` Alice Ryhl
2023-03-29 22:33 ` [PATCH v3 03/13] rust: types: add `Opaque::raw_get` y86-dev
2023-03-30 10:49 ` Gary Guo
2023-03-30 12:32 ` Andreas Hindborg
2023-03-30 13:33 ` Alice Ryhl
2023-03-29 22:33 ` [PATCH v3 04/13] rust: add pin-init API core y86-dev
2023-03-30 13:05 ` Andreas Hindborg
2023-03-30 15:46 ` Benno Lossin
2023-03-31 8:16 ` Andreas Hindborg
2023-03-30 13:17 ` Alice Ryhl
2023-03-30 13:33 ` Alice Ryhl
2023-03-30 14:16 ` Andreas Hindborg
2023-03-30 15:37 ` Benno Lossin
2023-03-30 15:36 ` Benno Lossin
2023-03-31 12:00 ` Andreas Hindborg
2023-03-29 22:33 ` [PATCH v3 05/13] rust: init: add initialization macros y86-dev
2023-03-30 14:21 ` Alice Ryhl
2023-03-30 15:38 ` Benno Lossin
2023-03-31 12:02 ` Andreas Hindborg
2023-03-29 22:33 ` [PATCH v3 06/13] rust: init/sync: add `InPlaceInit` trait to pin-initialize smart pointers y86-dev
2023-03-30 10:58 ` Gary Guo
2023-03-30 13:39 ` Andreas Hindborg
2023-03-30 14:37 ` Alice Ryhl
2023-03-30 15:28 ` Benno Lossin
2023-03-30 20:24 ` Alice Ryhl [this message]
2023-03-29 22:33 ` [PATCH v3 07/13] rust: init: add `PinnedDrop` trait and macros y86-dev
2023-03-30 11:01 ` Gary Guo
2023-03-30 15:41 ` Benno Lossin
2023-03-30 14:45 ` Alice Ryhl
2023-03-31 12:31 ` Andreas Hindborg
2023-03-29 22:33 ` [PATCH v3 08/13] rust: init: add `stack_pin_init!` macro y86-dev
2023-03-30 11:06 ` Gary Guo
2023-03-30 15:07 ` Alice Ryhl
2023-03-30 15:00 ` Alice Ryhl
2023-03-30 15:19 ` Benno Lossin
2023-03-30 20:28 ` Alice Ryhl
2023-03-31 12:43 ` Andreas Hindborg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1c2338c5-adab-f85c-645e-44e361ef0677@ryhl.io \
--to=alice@ryhl.io \
--cc=alex.gaynor@gmail.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=gary@garyguo.net \
--cc=linux-kernel@vger.kernel.org \
--cc=ojeda@kernel.org \
--cc=patches@lists.linux.dev \
--cc=rust-for-linux@vger.kernel.org \
--cc=wedsonaf@gmail.com \
--cc=y86-dev@protonmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).