From: Andreas Hindborg <nmi@metaspace.dk>
To: y86-dev@protonmail.com
Cc: "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>,
"Alice Ryhl" <alice@ryhl.io>,
rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
patches@lists.linux.dev,
"Andreas Hindborg" <a.hindborg@samsung.com>
Subject: Re: [PATCH v3 13/13] rust: sync: add functions for initializing `UniqueArc<MaybeUninit<T>>`
Date: Fri, 31 Mar 2023 15:07:18 +0200 [thread overview]
Message-ID: <87v8ih1329.fsf@metaspace.dk> (raw)
In-Reply-To: <20230329223239.138757-14-y86-dev@protonmail.com>
y86-dev@protonmail.com writes:
> From: Benno Lossin <y86-dev@protonmail.com>
>
> Add two functions `init_with` and `pin_init_with` to
> `UniqueArc<MaybeUninit<T>>` to initialize the memory of already allocated
> `UniqueArc`s. This is useful when you want to allocate memory check some
> condition inside of a context where allocation is forbidden and then
> conditionally initialize an object.
>
> Signed-off-by: Benno Lossin <y86-dev@protonmail.com>
> ---
Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
> rust/kernel/sync/arc.rs | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
> index 4ed6329a5e5f..64b0e9d67025 100644
> --- a/rust/kernel/sync/arc.rs
> +++ b/rust/kernel/sync/arc.rs
> @@ -540,6 +540,30 @@ impl<T> UniqueArc<MaybeUninit<T>> {
> inner: unsafe { Arc::from_inner(inner.cast()) },
> }
> }
> +
> + /// Initialize `self` using the given initializer.
> + pub fn init_with<E>(mut self, init: impl Init<T, E>) -> core::result::Result<UniqueArc<T>, E> {
> + // SAFETY: The supplied pointer is valid for initialization.
> + match unsafe { init.__init(self.as_mut_ptr()) } {
> + // SAFETY: Initialization completed successfully.
> + Ok(()) => Ok(unsafe { self.assume_init() }),
> + Err(err) => Err(err),
> + }
> + }
> +
> + /// Pin-initialize `self` using the given pin-initializer.
> + pub fn pin_init_with<E>(
> + mut self,
> + init: impl PinInit<T, E>,
> + ) -> core::result::Result<Pin<UniqueArc<T>>, E> {
> + // SAFETY: The supplied pointer is valid for initialization and we will later pin the value
> + // to ensure it does not move.
> + match unsafe { init.__pinned_init(self.as_mut_ptr()) } {
> + // SAFETY: Initialization completed successfully.
> + Ok(()) => Ok(unsafe { self.assume_init() }.into()),
> + Err(err) => Err(err),
> + }
> + }
> }
>
> impl<T: ?Sized> From<UniqueArc<T>> for Pin<UniqueArc<T>> {
prev parent reply other threads:[~2023-03-31 13:08 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-29 22:33 [PATCH v3 13/13] rust: sync: add functions for initializing `UniqueArc<MaybeUninit<T>>` y86-dev
2023-03-30 11:09 ` Gary Guo
2023-03-31 7:07 ` Alice Ryhl
2023-03-31 13:07 ` Andreas Hindborg [this message]
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=87v8ih1329.fsf@metaspace.dk \
--to=nmi@metaspace.dk \
--cc=a.hindborg@samsung.com \
--cc=alex.gaynor@gmail.com \
--cc=alice@ryhl.io \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.