mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:02:20 +00:00
rust: implement ForeignOwnable for Pin<Box<T>>
We already implement ForeignOwnable for Box<T>, but it may be useful to store pinned data in a ForeignOwnable container. This patch makes that possible. This will be used together with upcoming miscdev abstractions, which Binder will use when binderfs is disabled. Signed-off-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Benno Lossin <benno.lossin@proton.me> Link: https://lore.kernel.org/r/20240730-foreign-ownable-pin-box-v1-1-b1d70cdae541@google.com Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
This commit is contained in:
parent
08f983a55c
commit
6c2d0ad53b
@ -9,6 +9,7 @@ use core::{
|
|||||||
marker::{PhantomData, PhantomPinned},
|
marker::{PhantomData, PhantomPinned},
|
||||||
mem::MaybeUninit,
|
mem::MaybeUninit,
|
||||||
ops::{Deref, DerefMut},
|
ops::{Deref, DerefMut},
|
||||||
|
pin::Pin,
|
||||||
ptr::NonNull,
|
ptr::NonNull,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -89,6 +90,32 @@ impl<T: 'static> ForeignOwnable for Box<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: 'static> ForeignOwnable for Pin<Box<T>> {
|
||||||
|
type Borrowed<'a> = Pin<&'a T>;
|
||||||
|
|
||||||
|
fn into_foreign(self) -> *const core::ffi::c_void {
|
||||||
|
// SAFETY: We are still treating the box as pinned.
|
||||||
|
Box::into_raw(unsafe { Pin::into_inner_unchecked(self) }) as _
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe fn borrow<'a>(ptr: *const core::ffi::c_void) -> Pin<&'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.
|
||||||
|
let r = unsafe { &*ptr.cast() };
|
||||||
|
|
||||||
|
// SAFETY: This pointer originates from a `Pin<Box<T>>`.
|
||||||
|
unsafe { Pin::new_unchecked(r) }
|
||||||
|
}
|
||||||
|
|
||||||
|
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 { Pin::new_unchecked(Box::from_raw(ptr as _)) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl ForeignOwnable for () {
|
impl ForeignOwnable for () {
|
||||||
type Borrowed<'a> = ();
|
type Borrowed<'a> = ();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user