Commit 1944caa8 authored by Benno Lossin's avatar Benno Lossin Committed by Miguel Ojeda

rust: sync: add functions for initializing `UniqueArc<MaybeUninit<T>>`

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: default avatarBenno Lossin <benno.lossin@proton.me>
Reviewed-by: default avatarGary Guo <gary@garyguo.net>
Reviewed-by: default avatarAlice Ryhl <aliceryhl@google.com>
Reviewed-by: default avatarAndreas Hindborg <a.hindborg@samsung.com>
Link: https://lore.kernel.org/r/20230408122429.1103522-16-y86-dev@protonmail.comSigned-off-by: default avatarMiguel Ojeda <ojeda@kernel.org>
parent 701608bd
...@@ -544,6 +544,30 @@ pub unsafe fn assume_init(self) -> UniqueArc<T> { ...@@ -544,6 +544,30 @@ pub unsafe fn assume_init(self) -> UniqueArc<T> {
inner: unsafe { Arc::from_inner(inner.cast()) }, 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>> { impl<T: ?Sized> From<UniqueArc<T>> for Pin<UniqueArc<T>> {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment