Messages in this thread | | | Date | Sat, 28 Jan 2023 11:50:03 +0100 | Subject | Re: [PATCH 3/5] rust: types: implement `ForeignOwnable` for `Box<T>` | From | "Vincenzo Palazzo" <> |
| |
On Thu Jan 19, 2023 at 6:40 PM CET, Wedson Almeida Filho wrote: > This allows us to hand ownership of Rust dynamically allocated > objects to the C side of the kernel. > > Signed-off-by: Wedson Almeida Filho <wedsonaf@gmail.com> > --- Reviewed-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
> 1 file changed, 22 insertions(+) > > diff --git a/rust/kernel/types.rs b/rust/kernel/types.rs > index 5475f6163002..e037c262f23e 100644 > --- a/rust/kernel/types.rs > +++ b/rust/kernel/types.rs > @@ -63,6 +63,28 @@ pub trait ForeignOwnable { > unsafe fn from_foreign(ptr: *const core::ffi::c_void) -> Self; > } > > +impl<T: 'static> ForeignOwnable for Box<T> { > + type Borrowed<'a> = &'a T; > + > + fn into_foreign(self) -> *const core::ffi::c_void { > + Box::into_raw(self) as _ > + } > + > + unsafe fn borrow<'a>(ptr: *const core::ffi::c_void) -> &'a T { > + // SAFETY: The safety requirements for this function ensure that the object is still alive, > + // so it is safe to dereference the raw pointer. > + // The safety requirements of `from_foreign` also ensure that the object remains alive for > + // the lifetime of the returned value. > + unsafe { &*ptr.cast() } > + } > + > + unsafe fn from_foreign(ptr: *const core::ffi::c_void) -> Self { > + // SAFETY: The safety requirements of this function ensure that `ptr` comes from a previous > + // call to `Self::into_foreign`. > + unsafe { Box::from_raw(ptr as _) } > + } > +} > + > /// Runs a cleanup function/closure when dropped. > /// > /// The [`ScopeGuard::dismiss`] function prevents the cleanup function from running. > -- > 2.34.1
| |