mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
rust: types: implement ForeignOwnable
for Box<T>
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: Gary Guo <gary@garyguo.net> Reviewed-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com> Reviewed-by: Alice Ferrazzi <alice.ferrazzi@miraclelinux.com> Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com> Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
This commit is contained in:
parent
0fc4424d24
commit
26949bac1e
1 changed files with 23 additions and 0 deletions
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
//! Kernel types.
|
//! Kernel types.
|
||||||
|
|
||||||
|
use alloc::boxed::Box;
|
||||||
use core::{
|
use core::{
|
||||||
cell::UnsafeCell,
|
cell::UnsafeCell,
|
||||||
mem::MaybeUninit,
|
mem::MaybeUninit,
|
||||||
|
@ -62,6 +63,28 @@ pub trait ForeignOwnable: Sized {
|
||||||
unsafe fn from_foreign(ptr: *const core::ffi::c_void) -> Self;
|
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.
|
/// Runs a cleanup function/closure when dropped.
|
||||||
///
|
///
|
||||||
/// The [`ScopeGuard::dismiss`] function prevents the cleanup function from running.
|
/// The [`ScopeGuard::dismiss`] function prevents the cleanup function from running.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue