mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
rust: make pin-init its own crate
Rename relative paths inside of the crate to still refer to the same items, also rename paths inside of the kernel crate and adjust the build system to build the crate. [ Remove the `expect` (and thus the `lint_reasons` feature) since the tree now uses `quote!` from `rust/macros/export.rs`. Remove the `TokenStream` import removal, since it is now used as well. In addition, temporarily (i.e. just for this commit) use an `--extern force:alloc` to prevent an unknown `new_uninit` error in the `rustdoc` target. For context, please see a similar case in: https://lore.kernel.org/lkml/20240422090644.525520-1-ojeda@kernel.org/ And adjusted the message above. - Miguel ] Signed-off-by: Benno Lossin <benno.lossin@proton.me> Reviewed-by: Fiona Behrens <me@kloenk.dev> Tested-by: Andreas Hindborg <a.hindborg@kernel.org> Link: https://lore.kernel.org/r/20250308110339.2997091-16-benno.lossin@proton.me Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
This commit is contained in:
parent
d7659acca7
commit
dbd5058ba6
28 changed files with 164 additions and 153 deletions
|
@ -116,13 +116,13 @@ rustdoc-ffi: $(src)/ffi.rs rustdoc-core FORCE
|
||||||
rustdoc-pin_init_internal: private rustdoc_host = yes
|
rustdoc-pin_init_internal: private rustdoc_host = yes
|
||||||
rustdoc-pin_init_internal: private rustc_target_flags = --cfg kernel \
|
rustdoc-pin_init_internal: private rustc_target_flags = --cfg kernel \
|
||||||
--extern proc_macro --crate-type proc-macro
|
--extern proc_macro --crate-type proc-macro
|
||||||
rustdoc-pin_init_internal: $(src)/pin-init/internal/src/_lib.rs FORCE
|
rustdoc-pin_init_internal: $(src)/pin-init/internal/src/lib.rs FORCE
|
||||||
+$(call if_changed,rustdoc)
|
+$(call if_changed,rustdoc)
|
||||||
|
|
||||||
rustdoc-pin_init: private rustdoc_host = yes
|
rustdoc-pin_init: private rustdoc_host = yes
|
||||||
rustdoc-pin_init: private rustc_target_flags = --extern pin_init_internal \
|
rustdoc-pin_init: private rustc_target_flags = --extern pin_init_internal \
|
||||||
--extern macros --extern alloc --cfg kernel --cfg feature=\"alloc\"
|
--extern macros --extern force:alloc --cfg kernel --cfg feature=\"alloc\"
|
||||||
rustdoc-pin_init: $(src)/pin-init/src/_lib.rs rustdoc-pin_init_internal \
|
rustdoc-pin_init: $(src)/pin-init/src/lib.rs rustdoc-pin_init_internal \
|
||||||
rustdoc-macros FORCE
|
rustdoc-macros FORCE
|
||||||
+$(call if_changed,rustdoc)
|
+$(call if_changed,rustdoc)
|
||||||
|
|
||||||
|
@ -158,12 +158,12 @@ rusttestlib-macros: $(src)/macros/lib.rs FORCE
|
||||||
rusttestlib-pin_init_internal: private rustc_target_flags = --cfg kernel \
|
rusttestlib-pin_init_internal: private rustc_target_flags = --cfg kernel \
|
||||||
--extern proc_macro
|
--extern proc_macro
|
||||||
rusttestlib-pin_init_internal: private rustc_test_library_proc = yes
|
rusttestlib-pin_init_internal: private rustc_test_library_proc = yes
|
||||||
rusttestlib-pin_init_internal: $(src)/pin-init/internal/src/_lib.rs FORCE
|
rusttestlib-pin_init_internal: $(src)/pin-init/internal/src/lib.rs FORCE
|
||||||
+$(call if_changed,rustc_test_library)
|
+$(call if_changed,rustc_test_library)
|
||||||
|
|
||||||
rusttestlib-pin_init: private rustc_target_flags = --extern pin_init_internal \
|
rusttestlib-pin_init: private rustc_target_flags = --extern pin_init_internal \
|
||||||
--extern macros --cfg kernel
|
--extern macros --cfg kernel
|
||||||
rusttestlib-pin_init: $(src)/pin-init/src/_lib.rs rusttestlib-macros \
|
rusttestlib-pin_init: $(src)/pin-init/src/lib.rs rusttestlib-macros \
|
||||||
rusttestlib-pin_init_internal $(obj)/$(libpin_init_internal_name) FORCE
|
rusttestlib-pin_init_internal $(obj)/$(libpin_init_internal_name) FORCE
|
||||||
+$(call if_changed,rustc_test_library)
|
+$(call if_changed,rustc_test_library)
|
||||||
|
|
||||||
|
@ -401,7 +401,7 @@ $(obj)/$(libmacros_name): $(src)/macros/lib.rs FORCE
|
||||||
+$(call if_changed_dep,rustc_procmacro)
|
+$(call if_changed_dep,rustc_procmacro)
|
||||||
|
|
||||||
$(obj)/$(libpin_init_internal_name): private rustc_target_flags = --cfg kernel
|
$(obj)/$(libpin_init_internal_name): private rustc_target_flags = --cfg kernel
|
||||||
$(obj)/$(libpin_init_internal_name): $(src)/pin-init/internal/src/_lib.rs FORCE
|
$(obj)/$(libpin_init_internal_name): $(src)/pin-init/internal/src/lib.rs FORCE
|
||||||
+$(call if_changed_dep,rustc_procmacro)
|
+$(call if_changed_dep,rustc_procmacro)
|
||||||
|
|
||||||
quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L $@
|
quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L $@
|
||||||
|
@ -486,7 +486,7 @@ $(obj)/compiler_builtins.o: $(src)/compiler_builtins.rs $(obj)/core.o FORCE
|
||||||
$(obj)/pin_init.o: private skip_gendwarfksyms = 1
|
$(obj)/pin_init.o: private skip_gendwarfksyms = 1
|
||||||
$(obj)/pin_init.o: private rustc_target_flags = --extern pin_init_internal \
|
$(obj)/pin_init.o: private rustc_target_flags = --extern pin_init_internal \
|
||||||
--extern macros --cfg kernel
|
--extern macros --cfg kernel
|
||||||
$(obj)/pin_init.o: $(src)/pin-init/src/_lib.rs $(obj)/compiler_builtins.o \
|
$(obj)/pin_init.o: $(src)/pin-init/src/lib.rs $(obj)/compiler_builtins.o \
|
||||||
$(obj)/$(libpin_init_internal_name) $(obj)/$(libmacros_name) FORCE
|
$(obj)/$(libpin_init_internal_name) $(obj)/$(libmacros_name) FORCE
|
||||||
+$(call if_changed_rule,rustc_library)
|
+$(call if_changed_rule,rustc_library)
|
||||||
|
|
||||||
|
|
|
@ -15,9 +15,9 @@ use core::pin::Pin;
|
||||||
use core::ptr::NonNull;
|
use core::ptr::NonNull;
|
||||||
use core::result::Result;
|
use core::result::Result;
|
||||||
|
|
||||||
use crate::init::{InPlaceWrite, Init, PinInit, ZeroableOption};
|
use crate::init::InPlaceInit;
|
||||||
use crate::init_ext::InPlaceInit;
|
|
||||||
use crate::types::ForeignOwnable;
|
use crate::types::ForeignOwnable;
|
||||||
|
use pin_init::{InPlaceWrite, Init, PinInit, ZeroableOption};
|
||||||
|
|
||||||
/// The kernel's [`Box`] type -- a heap allocation for a single value of type `T`.
|
/// The kernel's [`Box`] type -- a heap allocation for a single value of type `T`.
|
||||||
///
|
///
|
||||||
|
|
|
@ -10,12 +10,11 @@ use crate::{
|
||||||
bindings,
|
bindings,
|
||||||
block::mq::{operations::OperationsVTable, request::RequestDataWrapper, Operations},
|
block::mq::{operations::OperationsVTable, request::RequestDataWrapper, Operations},
|
||||||
error,
|
error,
|
||||||
prelude::PinInit,
|
prelude::try_pin_init,
|
||||||
try_pin_init,
|
|
||||||
types::Opaque,
|
types::Opaque,
|
||||||
};
|
};
|
||||||
use core::{convert::TryInto, marker::PhantomData};
|
use core::{convert::TryInto, marker::PhantomData};
|
||||||
use macros::{pin_data, pinned_drop};
|
use pin_init::{pin_data, pinned_drop, PinInit};
|
||||||
|
|
||||||
/// A wrapper for the C `struct blk_mq_tag_set`.
|
/// A wrapper for the C `struct blk_mq_tag_set`.
|
||||||
///
|
///
|
||||||
|
|
|
@ -6,9 +6,9 @@
|
||||||
//! register using the [`Registration`] class.
|
//! register using the [`Registration`] class.
|
||||||
|
|
||||||
use crate::error::{Error, Result};
|
use crate::error::{Error, Result};
|
||||||
use crate::{device, init::PinInit, of, str::CStr, try_pin_init, types::Opaque, ThisModule};
|
use crate::{device, of, str::CStr, try_pin_init, types::Opaque, ThisModule};
|
||||||
use core::pin::Pin;
|
use core::pin::Pin;
|
||||||
use macros::{pin_data, pinned_drop};
|
use pin_init::{pin_data, pinned_drop, PinInit};
|
||||||
|
|
||||||
/// The [`RegistrationOps`] trait serves as generic interface for subsystems (e.g., PCI, Platform,
|
/// The [`RegistrationOps`] trait serves as generic interface for subsystems (e.g., PCI, Platform,
|
||||||
/// Amba, etc.) to provide the corresponding subsystem specific implementation to register /
|
/// Amba, etc.) to provide the corresponding subsystem specific implementation to register /
|
||||||
|
@ -114,7 +114,7 @@ macro_rules! module_driver {
|
||||||
impl $crate::InPlaceModule for DriverModule {
|
impl $crate::InPlaceModule for DriverModule {
|
||||||
fn init(
|
fn init(
|
||||||
module: &'static $crate::ThisModule
|
module: &'static $crate::ThisModule
|
||||||
) -> impl $crate::init::PinInit<Self, $crate::error::Error> {
|
) -> impl ::pin_init::PinInit<Self, $crate::error::Error> {
|
||||||
$crate::try_pin_init!(Self {
|
$crate::try_pin_init!(Self {
|
||||||
_driver <- $crate::driver::Registration::new(
|
_driver <- $crate::driver::Registration::new(
|
||||||
<Self as $crate::ModuleMetadata>::NAME,
|
<Self as $crate::ModuleMetadata>::NAME,
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
//!
|
//!
|
||||||
//! [`Opaque<T>`]: crate::types::Opaque
|
//! [`Opaque<T>`]: crate::types::Opaque
|
||||||
//! [`Opaque::ffi_init`]: crate::types::Opaque::ffi_init
|
//! [`Opaque::ffi_init`]: crate::types::Opaque::ffi_init
|
||||||
//! [`pin_init!`]: crate::pin_init
|
//! [`pin_init!`]: pin_init::pin_init
|
||||||
//!
|
//!
|
||||||
//! # Examples
|
//! # Examples
|
||||||
//!
|
//!
|
||||||
|
@ -137,8 +137,8 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
alloc::{AllocError, Flags},
|
alloc::{AllocError, Flags},
|
||||||
error::{self, Error},
|
error::{self, Error},
|
||||||
init::{init_from_closure, pin_init_from_closure, Init, PinInit},
|
|
||||||
};
|
};
|
||||||
|
use pin_init::{init_from_closure, pin_init_from_closure, Init, PinInit};
|
||||||
|
|
||||||
/// Smart pointer that can initialize memory in-place.
|
/// Smart pointer that can initialize memory in-place.
|
||||||
pub trait InPlaceInit<T>: Sized {
|
pub trait InPlaceInit<T>: Sized {
|
||||||
|
@ -205,7 +205,8 @@ pub trait InPlaceInit<T>: Sized {
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// use kernel::{init::zeroed, error::Error};
|
/// use kernel::error::Error;
|
||||||
|
/// use pin_init::zeroed;
|
||||||
/// struct BigBuf {
|
/// struct BigBuf {
|
||||||
/// big: KBox<[u8; 1024 * 1024 * 1024]>,
|
/// big: KBox<[u8; 1024 * 1024 * 1024]>,
|
||||||
/// small: [u8; 1024 * 1024],
|
/// small: [u8; 1024 * 1024],
|
||||||
|
@ -222,7 +223,7 @@ pub trait InPlaceInit<T>: Sized {
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// [`Infallible`]: core::convert::Infallible
|
/// [`Infallible`]: core::convert::Infallible
|
||||||
/// [`init!`]: crate::init!
|
/// [`init!`]: pin_init::init
|
||||||
/// [`try_pin_init!`]: crate::try_pin_init!
|
/// [`try_pin_init!`]: crate::try_pin_init!
|
||||||
/// [`Error`]: crate::error::Error
|
/// [`Error`]: crate::error::Error
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
|
@ -230,14 +231,14 @@ macro_rules! try_init {
|
||||||
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
||||||
$($fields:tt)*
|
$($fields:tt)*
|
||||||
}) => {
|
}) => {
|
||||||
$crate::_try_init!($(&$this in)? $t $(::<$($generics),* $(,)?>)? {
|
::pin_init::try_init!($(&$this in)? $t $(::<$($generics),* $(,)?>)? {
|
||||||
$($fields)*
|
$($fields)*
|
||||||
}? $crate::error::Error)
|
}? $crate::error::Error)
|
||||||
};
|
};
|
||||||
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
||||||
$($fields:tt)*
|
$($fields:tt)*
|
||||||
}? $err:ty) => {
|
}? $err:ty) => {
|
||||||
$crate::_try_init!($(&$this in)? $t $(::<$($generics),* $(,)?>)? {
|
::pin_init::try_init!($(&$this in)? $t $(::<$($generics),* $(,)?>)? {
|
||||||
$($fields)*
|
$($fields)*
|
||||||
}? $err)
|
}? $err)
|
||||||
};
|
};
|
||||||
|
@ -262,7 +263,8 @@ macro_rules! try_init {
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
/// # #![feature(new_uninit)]
|
/// # #![feature(new_uninit)]
|
||||||
/// use kernel::{init::zeroed, error::Error};
|
/// use kernel::error::Error;
|
||||||
|
/// use pin_init::zeroed;
|
||||||
/// #[pin_data]
|
/// #[pin_data]
|
||||||
/// struct BigBuf {
|
/// struct BigBuf {
|
||||||
/// big: KBox<[u8; 1024 * 1024 * 1024]>,
|
/// big: KBox<[u8; 1024 * 1024 * 1024]>,
|
||||||
|
@ -282,21 +284,21 @@ macro_rules! try_init {
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// [`Infallible`]: core::convert::Infallible
|
/// [`Infallible`]: core::convert::Infallible
|
||||||
/// [`pin_init!`]: crate::pin_init
|
/// [`pin_init!`]: pin_init::pin_init
|
||||||
/// [`Error`]: crate::error::Error
|
/// [`Error`]: crate::error::Error
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! try_pin_init {
|
macro_rules! try_pin_init {
|
||||||
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
||||||
$($fields:tt)*
|
$($fields:tt)*
|
||||||
}) => {
|
}) => {
|
||||||
$crate::_try_pin_init!($(&$this in)? $t $(::<$($generics),* $(,)?>)? {
|
::pin_init::try_pin_init!($(&$this in)? $t $(::<$($generics),* $(,)?>)? {
|
||||||
$($fields)*
|
$($fields)*
|
||||||
}? $crate::error::Error)
|
}? $crate::error::Error)
|
||||||
};
|
};
|
||||||
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
||||||
$($fields:tt)*
|
$($fields:tt)*
|
||||||
}? $err:ty) => {
|
}? $err:ty) => {
|
||||||
$crate::_try_pin_init!($(&$this in)? $t $(::<$($generics),* $(,)?>)? {
|
::pin_init::try_pin_init!($(&$this in)? $t $(::<$($generics),* $(,)?>)? {
|
||||||
$($fields)*
|
$($fields)*
|
||||||
}? $err)
|
}? $err)
|
||||||
};
|
};
|
||||||
|
|
|
@ -50,11 +50,7 @@ pub mod faux;
|
||||||
#[cfg(CONFIG_RUST_FW_LOADER_ABSTRACTIONS)]
|
#[cfg(CONFIG_RUST_FW_LOADER_ABSTRACTIONS)]
|
||||||
pub mod firmware;
|
pub mod firmware;
|
||||||
pub mod fs;
|
pub mod fs;
|
||||||
#[path = "../pin-init/src/lib.rs"]
|
|
||||||
pub mod init;
|
pub mod init;
|
||||||
// momentarily use the name `init_ext` and set the path manually
|
|
||||||
#[path = "init.rs"]
|
|
||||||
pub mod init_ext;
|
|
||||||
pub mod io;
|
pub mod io;
|
||||||
pub mod ioctl;
|
pub mod ioctl;
|
||||||
pub mod jump_label;
|
pub mod jump_label;
|
||||||
|
@ -116,11 +112,11 @@ pub trait InPlaceModule: Sync + Send {
|
||||||
/// Creates an initialiser for the module.
|
/// Creates an initialiser for the module.
|
||||||
///
|
///
|
||||||
/// It is called when the module is loaded.
|
/// It is called when the module is loaded.
|
||||||
fn init(module: &'static ThisModule) -> impl init::PinInit<Self, error::Error>;
|
fn init(module: &'static ThisModule) -> impl pin_init::PinInit<Self, error::Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Module> InPlaceModule for T {
|
impl<T: Module> InPlaceModule for T {
|
||||||
fn init(module: &'static ThisModule) -> impl init::PinInit<Self, error::Error> {
|
fn init(module: &'static ThisModule) -> impl pin_init::PinInit<Self, error::Error> {
|
||||||
let initer = move |slot: *mut Self| {
|
let initer = move |slot: *mut Self| {
|
||||||
let m = <Self as Module>::init(module)?;
|
let m = <Self as Module>::init(module)?;
|
||||||
|
|
||||||
|
@ -130,7 +126,7 @@ impl<T: Module> InPlaceModule for T {
|
||||||
};
|
};
|
||||||
|
|
||||||
// SAFETY: On success, `initer` always fully initialises an instance of `Self`.
|
// SAFETY: On success, `initer` always fully initialises an instance of `Self`.
|
||||||
unsafe { init::pin_init_from_closure(initer) }
|
unsafe { pin_init::pin_init_from_closure(initer) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,12 +4,12 @@
|
||||||
|
|
||||||
//! A linked list implementation.
|
//! A linked list implementation.
|
||||||
|
|
||||||
use crate::init::PinInit;
|
|
||||||
use crate::sync::ArcBorrow;
|
use crate::sync::ArcBorrow;
|
||||||
use crate::types::Opaque;
|
use crate::types::Opaque;
|
||||||
use core::iter::{DoubleEndedIterator, FusedIterator};
|
use core::iter::{DoubleEndedIterator, FusedIterator};
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
use core::ptr;
|
use core::ptr;
|
||||||
|
use pin_init::PinInit;
|
||||||
|
|
||||||
mod impl_list_item_mod;
|
mod impl_list_item_mod;
|
||||||
pub use self::impl_list_item_mod::{
|
pub use self::impl_list_item_mod::{
|
||||||
|
|
|
@ -17,7 +17,9 @@ pub use core::pin::Pin;
|
||||||
pub use crate::alloc::{flags::*, Box, KBox, KVBox, KVVec, KVec, VBox, VVec, Vec};
|
pub use crate::alloc::{flags::*, Box, KBox, KVBox, KVVec, KVec, VBox, VVec, Vec};
|
||||||
|
|
||||||
#[doc(no_inline)]
|
#[doc(no_inline)]
|
||||||
pub use macros::{export, module, pin_data, pinned_drop, vtable, Zeroable};
|
pub use macros::{export, module, vtable};
|
||||||
|
|
||||||
|
pub use pin_init::{init, pin_data, pin_init, pinned_drop, InPlaceWrite, Init, PinInit, Zeroable};
|
||||||
|
|
||||||
pub use super::{build_assert, build_error};
|
pub use super::{build_assert, build_error};
|
||||||
|
|
||||||
|
@ -28,7 +30,7 @@ pub use super::fmt;
|
||||||
pub use super::{dev_alert, dev_crit, dev_dbg, dev_emerg, dev_err, dev_info, dev_notice, dev_warn};
|
pub use super::{dev_alert, dev_crit, dev_dbg, dev_emerg, dev_err, dev_info, dev_notice, dev_warn};
|
||||||
pub use super::{pr_alert, pr_crit, pr_debug, pr_emerg, pr_err, pr_info, pr_notice, pr_warn};
|
pub use super::{pr_alert, pr_crit, pr_debug, pr_emerg, pr_err, pr_info, pr_notice, pr_warn};
|
||||||
|
|
||||||
pub use super::{init, pin_init, try_init, try_pin_init};
|
pub use super::{try_init, try_pin_init};
|
||||||
|
|
||||||
pub use super::static_assert;
|
pub use super::static_assert;
|
||||||
|
|
||||||
|
@ -36,7 +38,6 @@ pub use super::error::{code::*, Error, Result};
|
||||||
|
|
||||||
pub use super::{str::CStr, ThisModule};
|
pub use super::{str::CStr, ThisModule};
|
||||||
|
|
||||||
pub use super::init::{InPlaceWrite, Init, PinInit};
|
pub use super::init::InPlaceInit;
|
||||||
pub use super::init_ext::InPlaceInit;
|
|
||||||
|
|
||||||
pub use super::current;
|
pub use super::current;
|
||||||
|
|
|
@ -19,8 +19,7 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
alloc::{AllocError, Flags, KBox},
|
alloc::{AllocError, Flags, KBox},
|
||||||
bindings,
|
bindings,
|
||||||
init::{self, InPlaceWrite, Init, PinInit},
|
init::InPlaceInit,
|
||||||
init_ext::InPlaceInit,
|
|
||||||
try_init,
|
try_init,
|
||||||
types::{ForeignOwnable, Opaque},
|
types::{ForeignOwnable, Opaque},
|
||||||
};
|
};
|
||||||
|
@ -33,7 +32,7 @@ use core::{
|
||||||
pin::Pin,
|
pin::Pin,
|
||||||
ptr::NonNull,
|
ptr::NonNull,
|
||||||
};
|
};
|
||||||
use macros::pin_data;
|
use pin_init::{self, pin_data, InPlaceWrite, Init, PinInit};
|
||||||
|
|
||||||
mod std_vendor;
|
mod std_vendor;
|
||||||
|
|
||||||
|
@ -738,7 +737,7 @@ impl<T> UniqueArc<T> {
|
||||||
try_init!(ArcInner {
|
try_init!(ArcInner {
|
||||||
// SAFETY: There are no safety requirements for this FFI call.
|
// SAFETY: There are no safety requirements for this FFI call.
|
||||||
refcount: Opaque::new(unsafe { bindings::REFCOUNT_INIT(1) }),
|
refcount: Opaque::new(unsafe { bindings::REFCOUNT_INIT(1) }),
|
||||||
data <- init::uninit::<T, AllocError>(),
|
data <- pin_init::uninit::<T, AllocError>(),
|
||||||
}? AllocError),
|
}? AllocError),
|
||||||
flags,
|
flags,
|
||||||
)?;
|
)?;
|
||||||
|
|
|
@ -8,8 +8,6 @@
|
||||||
use super::{lock::Backend, lock::Guard, LockClassKey};
|
use super::{lock::Backend, lock::Guard, LockClassKey};
|
||||||
use crate::{
|
use crate::{
|
||||||
ffi::{c_int, c_long},
|
ffi::{c_int, c_long},
|
||||||
init::PinInit,
|
|
||||||
pin_init,
|
|
||||||
str::CStr,
|
str::CStr,
|
||||||
task::{MAX_SCHEDULE_TIMEOUT, TASK_INTERRUPTIBLE, TASK_NORMAL, TASK_UNINTERRUPTIBLE},
|
task::{MAX_SCHEDULE_TIMEOUT, TASK_INTERRUPTIBLE, TASK_NORMAL, TASK_UNINTERRUPTIBLE},
|
||||||
time::Jiffies,
|
time::Jiffies,
|
||||||
|
@ -17,7 +15,7 @@ use crate::{
|
||||||
};
|
};
|
||||||
use core::marker::PhantomPinned;
|
use core::marker::PhantomPinned;
|
||||||
use core::ptr;
|
use core::ptr;
|
||||||
use macros::pin_data;
|
use pin_init::{pin_data, pin_init, PinInit};
|
||||||
|
|
||||||
/// Creates a [`CondVar`] initialiser with the given name and a newly-created lock class.
|
/// Creates a [`CondVar`] initialiser with the given name and a newly-created lock class.
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
|
|
|
@ -7,13 +7,11 @@
|
||||||
|
|
||||||
use super::LockClassKey;
|
use super::LockClassKey;
|
||||||
use crate::{
|
use crate::{
|
||||||
init::PinInit,
|
|
||||||
pin_init,
|
|
||||||
str::CStr,
|
str::CStr,
|
||||||
types::{NotThreadSafe, Opaque, ScopeGuard},
|
types::{NotThreadSafe, Opaque, ScopeGuard},
|
||||||
};
|
};
|
||||||
use core::{cell::UnsafeCell, marker::PhantomPinned};
|
use core::{cell::UnsafeCell, marker::PhantomPinned};
|
||||||
use macros::pin_data;
|
use pin_init::{pin_data, pin_init, PinInit};
|
||||||
|
|
||||||
pub mod mutex;
|
pub mod mutex;
|
||||||
pub mod spinlock;
|
pub mod spinlock;
|
||||||
|
|
|
@ -26,7 +26,7 @@ pub use new_mutex;
|
||||||
/// Since it may block, [`Mutex`] needs to be used with care in atomic contexts.
|
/// Since it may block, [`Mutex`] needs to be used with care in atomic contexts.
|
||||||
///
|
///
|
||||||
/// Instances of [`Mutex`] need a lock class and to be pinned. The recommended way to create such
|
/// Instances of [`Mutex`] need a lock class and to be pinned. The recommended way to create such
|
||||||
/// instances is with the [`pin_init`](crate::pin_init) and [`new_mutex`] macros.
|
/// instances is with the [`pin_init`](pin_init::pin_init) and [`new_mutex`] macros.
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
|
|
|
@ -24,7 +24,7 @@ pub use new_spinlock;
|
||||||
/// unlocked, at which point another CPU will be allowed to make progress.
|
/// unlocked, at which point another CPU will be allowed to make progress.
|
||||||
///
|
///
|
||||||
/// Instances of [`SpinLock`] need a lock class and to be pinned. The recommended way to create such
|
/// Instances of [`SpinLock`] need a lock class and to be pinned. The recommended way to create such
|
||||||
/// instances is with the [`pin_init`](crate::pin_init) and [`new_spinlock`] macros.
|
/// instances is with the [`pin_init`](pin_init::pin_init) and [`new_spinlock`] macros.
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
//! Kernel types.
|
//! Kernel types.
|
||||||
|
|
||||||
use crate::init::{self, PinInit, Zeroable};
|
|
||||||
use core::{
|
use core::{
|
||||||
cell::UnsafeCell,
|
cell::UnsafeCell,
|
||||||
marker::{PhantomData, PhantomPinned},
|
marker::{PhantomData, PhantomPinned},
|
||||||
|
@ -10,6 +9,7 @@ use core::{
|
||||||
ops::{Deref, DerefMut},
|
ops::{Deref, DerefMut},
|
||||||
ptr::NonNull,
|
ptr::NonNull,
|
||||||
};
|
};
|
||||||
|
use pin_init::{PinInit, Zeroable};
|
||||||
|
|
||||||
/// Used to transfer ownership to and from foreign (non-Rust) languages.
|
/// Used to transfer ownership to and from foreign (non-Rust) languages.
|
||||||
///
|
///
|
||||||
|
@ -336,7 +336,7 @@ impl<T> Opaque<T> {
|
||||||
// - `ptr` is a valid pointer to uninitialized memory,
|
// - `ptr` is a valid pointer to uninitialized memory,
|
||||||
// - `slot` is not accessed on error; the call is infallible,
|
// - `slot` is not accessed on error; the call is infallible,
|
||||||
// - `slot` is pinned in memory.
|
// - `slot` is pinned in memory.
|
||||||
let _ = unsafe { init::PinInit::<T>::__pinned_init(slot, ptr) };
|
let _ = unsafe { PinInit::<T>::__pinned_init(slot, ptr) };
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,7 +352,7 @@ impl<T> Opaque<T> {
|
||||||
// SAFETY: We contain a `MaybeUninit`, so it is OK for the `init_func` to not fully
|
// SAFETY: We contain a `MaybeUninit`, so it is OK for the `init_func` to not fully
|
||||||
// initialize the `T`.
|
// initialize the `T`.
|
||||||
unsafe {
|
unsafe {
|
||||||
init::pin_init_from_closure::<_, ::core::convert::Infallible>(move |slot| {
|
pin_init::pin_init_from_closure::<_, ::core::convert::Infallible>(move |slot| {
|
||||||
init_func(Self::raw_get(slot));
|
init_func(Self::raw_get(slot));
|
||||||
Ok(())
|
Ok(())
|
||||||
})
|
})
|
||||||
|
@ -372,7 +372,9 @@ impl<T> Opaque<T> {
|
||||||
) -> impl PinInit<Self, E> {
|
) -> impl PinInit<Self, E> {
|
||||||
// SAFETY: We contain a `MaybeUninit`, so it is OK for the `init_func` to not fully
|
// SAFETY: We contain a `MaybeUninit`, so it is OK for the `init_func` to not fully
|
||||||
// initialize the `T`.
|
// initialize the `T`.
|
||||||
unsafe { init::pin_init_from_closure::<_, E>(move |slot| init_func(Self::raw_get(slot))) }
|
unsafe {
|
||||||
|
pin_init::pin_init_from_closure::<_, E>(move |slot| init_func(Self::raw_get(slot)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a raw pointer to the opaque data.
|
/// Returns a raw pointer to the opaque data.
|
||||||
|
|
|
@ -86,5 +86,3 @@ pub(crate) fn function_name(input: TokenStream) -> Option<Ident> {
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
include!("../pin-init/internal/src/helpers.rs");
|
|
||||||
|
|
|
@ -13,13 +13,7 @@ mod export;
|
||||||
mod helpers;
|
mod helpers;
|
||||||
mod module;
|
mod module;
|
||||||
mod paste;
|
mod paste;
|
||||||
#[path = "../pin-init/internal/src/pin_data.rs"]
|
|
||||||
mod pin_data;
|
|
||||||
#[path = "../pin-init/internal/src/pinned_drop.rs"]
|
|
||||||
mod pinned_drop;
|
|
||||||
mod vtable;
|
mod vtable;
|
||||||
#[path = "../pin-init/internal/src/zeroable.rs"]
|
|
||||||
mod zeroable;
|
|
||||||
|
|
||||||
use proc_macro::TokenStream;
|
use proc_macro::TokenStream;
|
||||||
|
|
||||||
|
@ -398,5 +392,3 @@ pub fn paste(input: TokenStream) -> TokenStream {
|
||||||
paste::expand(&mut tokens);
|
paste::expand(&mut tokens);
|
||||||
tokens.into_iter().collect()
|
tokens.into_iter().collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
include!("../pin-init/internal/src/lib.rs");
|
|
||||||
|
|
|
@ -244,7 +244,7 @@ pub(crate) fn module(ts: TokenStream) -> TokenStream {
|
||||||
mod __module_init {{
|
mod __module_init {{
|
||||||
mod __module_init {{
|
mod __module_init {{
|
||||||
use super::super::{type_};
|
use super::super::{type_};
|
||||||
use kernel::init::PinInit;
|
use pin_init::PinInit;
|
||||||
|
|
||||||
/// The \"Rust loadable module\" mark.
|
/// The \"Rust loadable module\" mark.
|
||||||
//
|
//
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
use proc_macro::{TokenStream, TokenTree};
|
use proc_macro::{TokenStream, TokenTree};
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
pub(crate) trait ToTokens {
|
pub(crate) trait ToTokens {
|
||||||
fn to_tokens(&self, tokens: &mut TokenStream);
|
fn to_tokens(&self, tokens: &mut TokenStream);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
// SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
||||||
|
|
||||||
//! Will be removed in a future commit, only exists to prevent compilation errors.
|
|
|
@ -1,5 +1,7 @@
|
||||||
// SPDX-License-Identifier: Apache-2.0 OR MIT
|
// SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||||
|
|
||||||
|
use proc_macro::{TokenStream, TokenTree};
|
||||||
|
|
||||||
/// Parsed generics.
|
/// Parsed generics.
|
||||||
///
|
///
|
||||||
/// See the field documentation for an explanation what each of the fields represents.
|
/// See the field documentation for an explanation what each of the fields represents.
|
||||||
|
|
|
@ -4,6 +4,22 @@
|
||||||
// and thus add a dependency on `include/config/RUSTC_VERSION_TEXT`, which is
|
// and thus add a dependency on `include/config/RUSTC_VERSION_TEXT`, which is
|
||||||
// touched by Kconfig when the version string from the compiler changes.
|
// touched by Kconfig when the version string from the compiler changes.
|
||||||
|
|
||||||
|
//! `pin-init` proc macros.
|
||||||
|
|
||||||
|
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
|
||||||
|
|
||||||
|
use proc_macro::TokenStream;
|
||||||
|
|
||||||
|
#[cfg(kernel)]
|
||||||
|
#[path = "../../../macros/quote.rs"]
|
||||||
|
#[macro_use]
|
||||||
|
mod quote;
|
||||||
|
|
||||||
|
mod helpers;
|
||||||
|
mod pin_data;
|
||||||
|
mod pinned_drop;
|
||||||
|
mod zeroable;
|
||||||
|
|
||||||
#[allow(missing_docs)]
|
#[allow(missing_docs)]
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn pin_data(inner: TokenStream, item: TokenStream) -> TokenStream {
|
pub fn pin_data(inner: TokenStream, item: TokenStream) -> TokenStream {
|
||||||
|
|
|
@ -5,7 +5,7 @@ use proc_macro::{Group, Punct, Spacing, TokenStream, TokenTree};
|
||||||
|
|
||||||
pub(crate) fn pin_data(args: TokenStream, input: TokenStream) -> TokenStream {
|
pub(crate) fn pin_data(args: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
// This proc-macro only does some pre-parsing and then delegates the actual parsing to
|
// This proc-macro only does some pre-parsing and then delegates the actual parsing to
|
||||||
// `kernel::__pin_data!`.
|
// `pin_init::__pin_data!`.
|
||||||
|
|
||||||
let (
|
let (
|
||||||
Generics {
|
Generics {
|
||||||
|
@ -71,7 +71,7 @@ pub(crate) fn pin_data(args: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
// This should be the body of the struct `{...}`.
|
// This should be the body of the struct `{...}`.
|
||||||
let last = rest.pop();
|
let last = rest.pop();
|
||||||
let mut quoted = quote!(::kernel::__pin_data! {
|
let mut quoted = quote!(::pin_init::__pin_data! {
|
||||||
parse_input:
|
parse_input:
|
||||||
@args(#args),
|
@args(#args),
|
||||||
@sig(#(#rest)*),
|
@sig(#(#rest)*),
|
||||||
|
|
|
@ -35,11 +35,11 @@ pub(crate) fn pinned_drop(_args: TokenStream, input: TokenStream) -> TokenStream
|
||||||
let idx = pinned_drop_idx
|
let idx = pinned_drop_idx
|
||||||
.unwrap_or_else(|| panic!("Expected an `impl` block implementing `PinnedDrop`."));
|
.unwrap_or_else(|| panic!("Expected an `impl` block implementing `PinnedDrop`."));
|
||||||
// Fully qualify the `PinnedDrop`, as to avoid any tampering.
|
// Fully qualify the `PinnedDrop`, as to avoid any tampering.
|
||||||
toks.splice(idx..idx, quote!(::kernel::init::));
|
toks.splice(idx..idx, quote!(::pin_init::));
|
||||||
// Take the `{}` body and call the declarative macro.
|
// Take the `{}` body and call the declarative macro.
|
||||||
if let Some(TokenTree::Group(last)) = toks.pop() {
|
if let Some(TokenTree::Group(last)) = toks.pop() {
|
||||||
let last = last.stream();
|
let last = last.stream();
|
||||||
quote!(::kernel::__pinned_drop! {
|
quote!(::pin_init::__pinned_drop! {
|
||||||
@impl_sig(#(#toks)*),
|
@impl_sig(#(#toks)*),
|
||||||
@impl_body(#last),
|
@impl_body(#last),
|
||||||
})
|
})
|
||||||
|
|
|
@ -27,7 +27,7 @@ pub(crate) fn derive(input: TokenStream) -> TokenStream {
|
||||||
// If we find a `,`, then we have finished a generic/constant/lifetime parameter.
|
// If we find a `,`, then we have finished a generic/constant/lifetime parameter.
|
||||||
TokenTree::Punct(p) if nested == 0 && p.as_char() == ',' => {
|
TokenTree::Punct(p) if nested == 0 && p.as_char() == ',' => {
|
||||||
if in_generic && !inserted {
|
if in_generic && !inserted {
|
||||||
new_impl_generics.extend(quote! { : ::kernel::init::Zeroable });
|
new_impl_generics.extend(quote! { : ::pin_init::Zeroable });
|
||||||
}
|
}
|
||||||
in_generic = true;
|
in_generic = true;
|
||||||
inserted = false;
|
inserted = false;
|
||||||
|
@ -41,7 +41,7 @@ pub(crate) fn derive(input: TokenStream) -> TokenStream {
|
||||||
TokenTree::Punct(p) if nested == 0 && p.as_char() == ':' => {
|
TokenTree::Punct(p) if nested == 0 && p.as_char() == ':' => {
|
||||||
new_impl_generics.push(tt);
|
new_impl_generics.push(tt);
|
||||||
if in_generic {
|
if in_generic {
|
||||||
new_impl_generics.extend(quote! { ::kernel::init::Zeroable + });
|
new_impl_generics.extend(quote! { ::pin_init::Zeroable + });
|
||||||
inserted = true;
|
inserted = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,10 +59,10 @@ pub(crate) fn derive(input: TokenStream) -> TokenStream {
|
||||||
}
|
}
|
||||||
assert_eq!(nested, 0);
|
assert_eq!(nested, 0);
|
||||||
if in_generic && !inserted {
|
if in_generic && !inserted {
|
||||||
new_impl_generics.extend(quote! { : ::kernel::init::Zeroable });
|
new_impl_generics.extend(quote! { : ::pin_init::Zeroable });
|
||||||
}
|
}
|
||||||
quote! {
|
quote! {
|
||||||
::kernel::__derive_zeroable!(
|
::pin_init::__derive_zeroable!(
|
||||||
parse_input:
|
parse_input:
|
||||||
@sig(#(#rest)*),
|
@sig(#(#rest)*),
|
||||||
@impl_generics(#(#new_impl_generics)*),
|
@impl_generics(#(#new_impl_generics)*),
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
// SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
||||||
|
|
||||||
//! Will be removed in a future commit, only exists to prevent compilation errors.
|
|
||||||
|
|
||||||
#![no_std]
|
|
|
@ -209,9 +209,21 @@
|
||||||
//! [`impl PinInit<Foo>`]: PinInit
|
//! [`impl PinInit<Foo>`]: PinInit
|
||||||
//! [`impl PinInit<T, E>`]: PinInit
|
//! [`impl PinInit<T, E>`]: PinInit
|
||||||
//! [`impl Init<T, E>`]: Init
|
//! [`impl Init<T, E>`]: Init
|
||||||
//! [`pin_data`]: ::macros::pin_data
|
//! [`pin_data`]: crate::pin_data
|
||||||
//! [`pin_init!`]: crate::pin_init!
|
//! [`pin_init!`]: crate::pin_init!
|
||||||
|
|
||||||
|
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
|
||||||
|
#![cfg_attr(
|
||||||
|
all(
|
||||||
|
any(feature = "alloc", feature = "std"),
|
||||||
|
not(RUSTC_NEW_UNINIT_IS_STABLE)
|
||||||
|
),
|
||||||
|
feature(new_uninit)
|
||||||
|
)]
|
||||||
|
#![forbid(missing_docs, unsafe_op_in_unsafe_fn)]
|
||||||
|
#![cfg_attr(not(feature = "std"), no_std)]
|
||||||
|
#![cfg_attr(feature = "alloc", feature(allocator_api))]
|
||||||
|
|
||||||
use core::{
|
use core::{
|
||||||
cell::UnsafeCell,
|
cell::UnsafeCell,
|
||||||
convert::Infallible,
|
convert::Infallible,
|
||||||
|
@ -288,7 +300,7 @@ pub mod macros;
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// [`pin_init!`]: crate::pin_init
|
/// [`pin_init!`]: crate::pin_init
|
||||||
pub use ::macros::pin_data;
|
pub use ::pin_init_internal::pin_data;
|
||||||
|
|
||||||
/// Used to implement `PinnedDrop` safely.
|
/// Used to implement `PinnedDrop` safely.
|
||||||
///
|
///
|
||||||
|
@ -322,7 +334,7 @@ pub use ::macros::pin_data;
|
||||||
/// }
|
/// }
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
pub use ::macros::pinned_drop;
|
pub use ::pin_init_internal::pinned_drop;
|
||||||
|
|
||||||
/// Derives the [`Zeroable`] trait for the given struct.
|
/// Derives the [`Zeroable`] trait for the given struct.
|
||||||
///
|
///
|
||||||
|
@ -340,7 +352,7 @@ pub use ::macros::pinned_drop;
|
||||||
/// len: usize,
|
/// len: usize,
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
pub use ::macros::Zeroable;
|
pub use ::pin_init_internal::Zeroable;
|
||||||
|
|
||||||
/// Initialize and pin a type directly on the stack.
|
/// Initialize and pin a type directly on the stack.
|
||||||
///
|
///
|
||||||
|
@ -385,8 +397,8 @@ pub use ::macros::Zeroable;
|
||||||
macro_rules! stack_pin_init {
|
macro_rules! stack_pin_init {
|
||||||
(let $var:ident $(: $t:ty)? = $val:expr) => {
|
(let $var:ident $(: $t:ty)? = $val:expr) => {
|
||||||
let val = $val;
|
let val = $val;
|
||||||
let mut $var = ::core::pin::pin!($crate::init::__internal::StackInit$(::<$t>)?::uninit());
|
let mut $var = ::core::pin::pin!($crate::__internal::StackInit$(::<$t>)?::uninit());
|
||||||
let mut $var = match $crate::init::__internal::StackInit::init($var, val) {
|
let mut $var = match $crate::__internal::StackInit::init($var, val) {
|
||||||
Ok(res) => res,
|
Ok(res) => res,
|
||||||
Err(x) => {
|
Err(x) => {
|
||||||
let x: ::core::convert::Infallible = x;
|
let x: ::core::convert::Infallible = x;
|
||||||
|
@ -463,13 +475,13 @@ macro_rules! stack_pin_init {
|
||||||
macro_rules! stack_try_pin_init {
|
macro_rules! stack_try_pin_init {
|
||||||
(let $var:ident $(: $t:ty)? = $val:expr) => {
|
(let $var:ident $(: $t:ty)? = $val:expr) => {
|
||||||
let val = $val;
|
let val = $val;
|
||||||
let mut $var = ::core::pin::pin!($crate::init::__internal::StackInit$(::<$t>)?::uninit());
|
let mut $var = ::core::pin::pin!($crate::__internal::StackInit$(::<$t>)?::uninit());
|
||||||
let mut $var = $crate::init::__internal::StackInit::init($var, val);
|
let mut $var = $crate::__internal::StackInit::init($var, val);
|
||||||
};
|
};
|
||||||
(let $var:ident $(: $t:ty)? =? $val:expr) => {
|
(let $var:ident $(: $t:ty)? =? $val:expr) => {
|
||||||
let val = $val;
|
let val = $val;
|
||||||
let mut $var = ::core::pin::pin!($crate::init::__internal::StackInit$(::<$t>)?::uninit());
|
let mut $var = ::core::pin::pin!($crate::__internal::StackInit$(::<$t>)?::uninit());
|
||||||
let mut $var = $crate::init::__internal::StackInit::init($var, val)?;
|
let mut $var = $crate::__internal::StackInit::init($var, val)?;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -670,7 +682,7 @@ macro_rules! pin_init {
|
||||||
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
||||||
$($fields:tt)*
|
$($fields:tt)*
|
||||||
}) => {
|
}) => {
|
||||||
$crate::_try_pin_init!($(&$this in)? $t $(::<$($generics),*>)? {
|
$crate::try_pin_init!($(&$this in)? $t $(::<$($generics),*>)? {
|
||||||
$($fields)*
|
$($fields)*
|
||||||
}? ::core::convert::Infallible)
|
}? ::core::convert::Infallible)
|
||||||
};
|
};
|
||||||
|
@ -716,7 +728,7 @@ macro_rules! pin_init {
|
||||||
// For a detailed example of how this macro works, see the module documentation of the hidden
|
// For a detailed example of how this macro works, see the module documentation of the hidden
|
||||||
// module `__internal` inside of `init/__internal.rs`.
|
// module `__internal` inside of `init/__internal.rs`.
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! _try_pin_init {
|
macro_rules! try_pin_init {
|
||||||
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
||||||
$($fields:tt)*
|
$($fields:tt)*
|
||||||
}? $err:ty) => {
|
}? $err:ty) => {
|
||||||
|
@ -755,7 +767,7 @@ macro_rules! init {
|
||||||
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
||||||
$($fields:tt)*
|
$($fields:tt)*
|
||||||
}) => {
|
}) => {
|
||||||
$crate::_try_init!($(&$this in)? $t $(::<$($generics),*>)? {
|
$crate::try_init!($(&$this in)? $t $(::<$($generics),*>)? {
|
||||||
$($fields)*
|
$($fields)*
|
||||||
}? ::core::convert::Infallible)
|
}? ::core::convert::Infallible)
|
||||||
}
|
}
|
||||||
|
@ -798,7 +810,7 @@ macro_rules! init {
|
||||||
// For a detailed example of how this macro works, see the module documentation of the hidden
|
// For a detailed example of how this macro works, see the module documentation of the hidden
|
||||||
// module `__internal` inside of `init/__internal.rs`.
|
// module `__internal` inside of `init/__internal.rs`.
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! _try_init {
|
macro_rules! try_init {
|
||||||
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
($(&$this:ident in)? $t:ident $(::<$($generics:ty),* $(,)?>)? {
|
||||||
$($fields:tt)*
|
$($fields:tt)*
|
||||||
}? $err:ty) => {
|
}? $err:ty) => {
|
||||||
|
@ -868,8 +880,8 @@ macro_rules! assert_pinned {
|
||||||
($ty:ty, $field:ident, $field_ty:ty, inline) => {
|
($ty:ty, $field:ident, $field_ty:ty, inline) => {
|
||||||
let _ = move |ptr: *mut $field_ty| {
|
let _ = move |ptr: *mut $field_ty| {
|
||||||
// SAFETY: This code is unreachable.
|
// SAFETY: This code is unreachable.
|
||||||
let data = unsafe { <$ty as $crate::init::__internal::HasPinData>::__pin_data() };
|
let data = unsafe { <$ty as $crate::__internal::HasPinData>::__pin_data() };
|
||||||
let init = $crate::init::__internal::AlwaysFail::<$field_ty>::new();
|
let init = $crate::__internal::AlwaysFail::<$field_ty>::new();
|
||||||
// SAFETY: This code is unreachable.
|
// SAFETY: This code is unreachable.
|
||||||
unsafe { data.$field(ptr, init) }.ok();
|
unsafe { data.$field(ptr, init) }.ok();
|
||||||
};
|
};
|
||||||
|
@ -1262,7 +1274,7 @@ pub trait InPlaceWrite<T> {
|
||||||
///
|
///
|
||||||
/// This trait must be implemented via the [`pinned_drop`] proc-macro attribute on the impl.
|
/// This trait must be implemented via the [`pinned_drop`] proc-macro attribute on the impl.
|
||||||
///
|
///
|
||||||
/// [`pinned_drop`]: crate::macros::pinned_drop
|
/// [`pinned_drop`]: crate::pinned_drop
|
||||||
pub unsafe trait PinnedDrop: __internal::HasPinData {
|
pub unsafe trait PinnedDrop: __internal::HasPinData {
|
||||||
/// Executes the pinned destructor of this type.
|
/// Executes the pinned destructor of this type.
|
||||||
///
|
///
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
//! We will look at the following example:
|
//! We will look at the following example:
|
||||||
//!
|
//!
|
||||||
//! ```rust,ignore
|
//! ```rust,ignore
|
||||||
//! # use kernel::init::*;
|
//! # use pin_init::*;
|
||||||
//! # use core::pin::Pin;
|
//! # use core::pin::Pin;
|
||||||
//! #[pin_data]
|
//! #[pin_data]
|
||||||
//! #[repr(C)]
|
//! #[repr(C)]
|
||||||
|
@ -75,7 +75,7 @@
|
||||||
//! Here is the definition of `Bar` from our example:
|
//! Here is the definition of `Bar` from our example:
|
||||||
//!
|
//!
|
||||||
//! ```rust,ignore
|
//! ```rust,ignore
|
||||||
//! # use kernel::init::*;
|
//! # use pin_init::*;
|
||||||
//! #[pin_data]
|
//! #[pin_data]
|
||||||
//! #[repr(C)]
|
//! #[repr(C)]
|
||||||
//! struct Bar<T> {
|
//! struct Bar<T> {
|
||||||
|
@ -121,22 +121,22 @@
|
||||||
//! self,
|
//! self,
|
||||||
//! slot: *mut T,
|
//! slot: *mut T,
|
||||||
//! // Since `t` is `#[pin]`, this is `PinInit`.
|
//! // Since `t` is `#[pin]`, this is `PinInit`.
|
||||||
//! init: impl ::kernel::init::PinInit<T, E>,
|
//! init: impl ::pin_init::PinInit<T, E>,
|
||||||
//! ) -> ::core::result::Result<(), E> {
|
//! ) -> ::core::result::Result<(), E> {
|
||||||
//! unsafe { ::kernel::init::PinInit::__pinned_init(init, slot) }
|
//! unsafe { ::pin_init::PinInit::__pinned_init(init, slot) }
|
||||||
//! }
|
//! }
|
||||||
//! pub unsafe fn x<E>(
|
//! pub unsafe fn x<E>(
|
||||||
//! self,
|
//! self,
|
||||||
//! slot: *mut usize,
|
//! slot: *mut usize,
|
||||||
//! // Since `x` is not `#[pin]`, this is `Init`.
|
//! // Since `x` is not `#[pin]`, this is `Init`.
|
||||||
//! init: impl ::kernel::init::Init<usize, E>,
|
//! init: impl ::pin_init::Init<usize, E>,
|
||||||
//! ) -> ::core::result::Result<(), E> {
|
//! ) -> ::core::result::Result<(), E> {
|
||||||
//! unsafe { ::kernel::init::Init::__init(init, slot) }
|
//! unsafe { ::pin_init::Init::__init(init, slot) }
|
||||||
//! }
|
//! }
|
||||||
//! }
|
//! }
|
||||||
//! // Implement the internal `HasPinData` trait that associates `Bar` with the pin-data struct
|
//! // Implement the internal `HasPinData` trait that associates `Bar` with the pin-data struct
|
||||||
//! // that we constructed above.
|
//! // that we constructed above.
|
||||||
//! unsafe impl<T> ::kernel::init::__internal::HasPinData for Bar<T> {
|
//! unsafe impl<T> ::pin_init::__internal::HasPinData for Bar<T> {
|
||||||
//! type PinData = __ThePinData<T>;
|
//! type PinData = __ThePinData<T>;
|
||||||
//! unsafe fn __pin_data() -> Self::PinData {
|
//! unsafe fn __pin_data() -> Self::PinData {
|
||||||
//! __ThePinData {
|
//! __ThePinData {
|
||||||
|
@ -147,7 +147,7 @@
|
||||||
//! // Implement the internal `PinData` trait that marks the pin-data struct as a pin-data
|
//! // Implement the internal `PinData` trait that marks the pin-data struct as a pin-data
|
||||||
//! // struct. This is important to ensure that no user can implement a rogue `__pin_data`
|
//! // struct. This is important to ensure that no user can implement a rogue `__pin_data`
|
||||||
//! // function without using `unsafe`.
|
//! // function without using `unsafe`.
|
||||||
//! unsafe impl<T> ::kernel::init::__internal::PinData for __ThePinData<T> {
|
//! unsafe impl<T> ::pin_init::__internal::PinData for __ThePinData<T> {
|
||||||
//! type Datee = Bar<T>;
|
//! type Datee = Bar<T>;
|
||||||
//! }
|
//! }
|
||||||
//! // Now we only want to implement `Unpin` for `Bar` when every structurally pinned field is
|
//! // Now we only want to implement `Unpin` for `Bar` when every structurally pinned field is
|
||||||
|
@ -191,7 +191,7 @@
|
||||||
//! #[expect(non_camel_case_types)]
|
//! #[expect(non_camel_case_types)]
|
||||||
//! trait UselessPinnedDropImpl_you_need_to_specify_PinnedDrop {}
|
//! trait UselessPinnedDropImpl_you_need_to_specify_PinnedDrop {}
|
||||||
//! impl<
|
//! impl<
|
||||||
//! T: ::kernel::init::PinnedDrop,
|
//! T: ::pin_init::PinnedDrop,
|
||||||
//! > UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for T {}
|
//! > UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for T {}
|
||||||
//! impl<T> UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for Bar<T> {}
|
//! impl<T> UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for Bar<T> {}
|
||||||
//! };
|
//! };
|
||||||
|
@ -227,11 +227,11 @@
|
||||||
//! // - we `use` the `HasPinData` trait in the block, it is only available in that
|
//! // - we `use` the `HasPinData` trait in the block, it is only available in that
|
||||||
//! // scope.
|
//! // scope.
|
||||||
//! let data = unsafe {
|
//! let data = unsafe {
|
||||||
//! use ::kernel::init::__internal::HasPinData;
|
//! use ::pin_init::__internal::HasPinData;
|
||||||
//! Self::__pin_data()
|
//! Self::__pin_data()
|
||||||
//! };
|
//! };
|
||||||
//! // Ensure that `data` really is of type `PinData` and help with type inference:
|
//! // Ensure that `data` really is of type `PinData` and help with type inference:
|
||||||
//! let init = ::kernel::init::__internal::PinData::make_closure::<
|
//! let init = ::pin_init::__internal::PinData::make_closure::<
|
||||||
//! _,
|
//! _,
|
||||||
//! __InitOk,
|
//! __InitOk,
|
||||||
//! ::core::convert::Infallible,
|
//! ::core::convert::Infallible,
|
||||||
|
@ -262,7 +262,7 @@
|
||||||
//! }
|
//! }
|
||||||
//! // We again create a `DropGuard`.
|
//! // We again create a `DropGuard`.
|
||||||
//! let __x_guard = unsafe {
|
//! let __x_guard = unsafe {
|
||||||
//! ::kernel::init::__internal::DropGuard::new(::core::addr_of_mut!((*slot).x))
|
//! ::pin_init::__internal::DropGuard::new(::core::addr_of_mut!((*slot).x))
|
||||||
//! };
|
//! };
|
||||||
//! // Since initialization has successfully completed, we can now forget
|
//! // Since initialization has successfully completed, we can now forget
|
||||||
//! // the guards. This is not `mem::forget`, since we only have
|
//! // the guards. This is not `mem::forget`, since we only have
|
||||||
|
@ -303,7 +303,7 @@
|
||||||
//! };
|
//! };
|
||||||
//! // Construct the initializer.
|
//! // Construct the initializer.
|
||||||
//! let init = unsafe {
|
//! let init = unsafe {
|
||||||
//! ::kernel::init::pin_init_from_closure::<
|
//! ::pin_init::pin_init_from_closure::<
|
||||||
//! _,
|
//! _,
|
||||||
//! ::core::convert::Infallible,
|
//! ::core::convert::Infallible,
|
||||||
//! >(init)
|
//! >(init)
|
||||||
|
@ -350,19 +350,19 @@
|
||||||
//! unsafe fn b<E>(
|
//! unsafe fn b<E>(
|
||||||
//! self,
|
//! self,
|
||||||
//! slot: *mut Bar<u32>,
|
//! slot: *mut Bar<u32>,
|
||||||
//! init: impl ::kernel::init::PinInit<Bar<u32>, E>,
|
//! init: impl ::pin_init::PinInit<Bar<u32>, E>,
|
||||||
//! ) -> ::core::result::Result<(), E> {
|
//! ) -> ::core::result::Result<(), E> {
|
||||||
//! unsafe { ::kernel::init::PinInit::__pinned_init(init, slot) }
|
//! unsafe { ::pin_init::PinInit::__pinned_init(init, slot) }
|
||||||
//! }
|
//! }
|
||||||
//! unsafe fn a<E>(
|
//! unsafe fn a<E>(
|
||||||
//! self,
|
//! self,
|
||||||
//! slot: *mut usize,
|
//! slot: *mut usize,
|
||||||
//! init: impl ::kernel::init::Init<usize, E>,
|
//! init: impl ::pin_init::Init<usize, E>,
|
||||||
//! ) -> ::core::result::Result<(), E> {
|
//! ) -> ::core::result::Result<(), E> {
|
||||||
//! unsafe { ::kernel::init::Init::__init(init, slot) }
|
//! unsafe { ::pin_init::Init::__init(init, slot) }
|
||||||
//! }
|
//! }
|
||||||
//! }
|
//! }
|
||||||
//! unsafe impl ::kernel::init::__internal::HasPinData for Foo {
|
//! unsafe impl ::pin_init::__internal::HasPinData for Foo {
|
||||||
//! type PinData = __ThePinData;
|
//! type PinData = __ThePinData;
|
||||||
//! unsafe fn __pin_data() -> Self::PinData {
|
//! unsafe fn __pin_data() -> Self::PinData {
|
||||||
//! __ThePinData {
|
//! __ThePinData {
|
||||||
|
@ -370,7 +370,7 @@
|
||||||
//! }
|
//! }
|
||||||
//! }
|
//! }
|
||||||
//! }
|
//! }
|
||||||
//! unsafe impl ::kernel::init::__internal::PinData for __ThePinData {
|
//! unsafe impl ::pin_init::__internal::PinData for __ThePinData {
|
||||||
//! type Datee = Foo;
|
//! type Datee = Foo;
|
||||||
//! }
|
//! }
|
||||||
//! #[allow(dead_code)]
|
//! #[allow(dead_code)]
|
||||||
|
@ -394,8 +394,8 @@
|
||||||
//! let pinned = unsafe { ::core::pin::Pin::new_unchecked(self) };
|
//! let pinned = unsafe { ::core::pin::Pin::new_unchecked(self) };
|
||||||
//! // Create the unsafe token that proves that we are inside of a destructor, this
|
//! // Create the unsafe token that proves that we are inside of a destructor, this
|
||||||
//! // type is only allowed to be created in a destructor.
|
//! // type is only allowed to be created in a destructor.
|
||||||
//! let token = unsafe { ::kernel::init::__internal::OnlyCallFromDrop::new() };
|
//! let token = unsafe { ::pin_init::__internal::OnlyCallFromDrop::new() };
|
||||||
//! ::kernel::init::PinnedDrop::drop(pinned, token);
|
//! ::pin_init::PinnedDrop::drop(pinned, token);
|
||||||
//! }
|
//! }
|
||||||
//! }
|
//! }
|
||||||
//! };
|
//! };
|
||||||
|
@ -421,8 +421,8 @@
|
||||||
//!
|
//!
|
||||||
//! ```rust,ignore
|
//! ```rust,ignore
|
||||||
//! // `unsafe`, full path and the token parameter are added, everything else stays the same.
|
//! // `unsafe`, full path and the token parameter are added, everything else stays the same.
|
||||||
//! unsafe impl ::kernel::init::PinnedDrop for Foo {
|
//! unsafe impl ::pin_init::PinnedDrop for Foo {
|
||||||
//! fn drop(self: Pin<&mut Self>, _: ::kernel::init::__internal::OnlyCallFromDrop) {
|
//! fn drop(self: Pin<&mut Self>, _: ::pin_init::__internal::OnlyCallFromDrop) {
|
||||||
//! pr_info!("{self:p} is getting dropped.");
|
//! pr_info!("{self:p} is getting dropped.");
|
||||||
//! }
|
//! }
|
||||||
//! }
|
//! }
|
||||||
|
@ -448,10 +448,10 @@
|
||||||
//! let initializer = {
|
//! let initializer = {
|
||||||
//! struct __InitOk;
|
//! struct __InitOk;
|
||||||
//! let data = unsafe {
|
//! let data = unsafe {
|
||||||
//! use ::kernel::init::__internal::HasPinData;
|
//! use ::pin_init::__internal::HasPinData;
|
||||||
//! Foo::__pin_data()
|
//! Foo::__pin_data()
|
||||||
//! };
|
//! };
|
||||||
//! let init = ::kernel::init::__internal::PinData::make_closure::<
|
//! let init = ::pin_init::__internal::PinData::make_closure::<
|
||||||
//! _,
|
//! _,
|
||||||
//! __InitOk,
|
//! __InitOk,
|
||||||
//! ::core::convert::Infallible,
|
//! ::core::convert::Infallible,
|
||||||
|
@ -462,12 +462,12 @@
|
||||||
//! unsafe { ::core::ptr::write(::core::addr_of_mut!((*slot).a), a) };
|
//! unsafe { ::core::ptr::write(::core::addr_of_mut!((*slot).a), a) };
|
||||||
//! }
|
//! }
|
||||||
//! let __a_guard = unsafe {
|
//! let __a_guard = unsafe {
|
||||||
//! ::kernel::init::__internal::DropGuard::new(::core::addr_of_mut!((*slot).a))
|
//! ::pin_init::__internal::DropGuard::new(::core::addr_of_mut!((*slot).a))
|
||||||
//! };
|
//! };
|
||||||
//! let init = Bar::new(36);
|
//! let init = Bar::new(36);
|
||||||
//! unsafe { data.b(::core::addr_of_mut!((*slot).b), b)? };
|
//! unsafe { data.b(::core::addr_of_mut!((*slot).b), b)? };
|
||||||
//! let __b_guard = unsafe {
|
//! let __b_guard = unsafe {
|
||||||
//! ::kernel::init::__internal::DropGuard::new(::core::addr_of_mut!((*slot).b))
|
//! ::pin_init::__internal::DropGuard::new(::core::addr_of_mut!((*slot).b))
|
||||||
//! };
|
//! };
|
||||||
//! ::core::mem::forget(__b_guard);
|
//! ::core::mem::forget(__b_guard);
|
||||||
//! ::core::mem::forget(__a_guard);
|
//! ::core::mem::forget(__a_guard);
|
||||||
|
@ -492,13 +492,16 @@
|
||||||
//! init(slot).map(|__InitOk| ())
|
//! init(slot).map(|__InitOk| ())
|
||||||
//! };
|
//! };
|
||||||
//! let init = unsafe {
|
//! let init = unsafe {
|
||||||
//! ::kernel::init::pin_init_from_closure::<_, ::core::convert::Infallible>(init)
|
//! ::pin_init::pin_init_from_closure::<_, ::core::convert::Infallible>(init)
|
||||||
//! };
|
//! };
|
||||||
//! init
|
//! init
|
||||||
//! };
|
//! };
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
|
#[cfg(kernel)]
|
||||||
pub use ::macros::paste;
|
pub use ::macros::paste;
|
||||||
|
#[cfg(not(kernel))]
|
||||||
|
pub use ::paste::paste;
|
||||||
|
|
||||||
/// Creates a `unsafe impl<...> PinnedDrop for $type` block.
|
/// Creates a `unsafe impl<...> PinnedDrop for $type` block.
|
||||||
///
|
///
|
||||||
|
@ -519,7 +522,7 @@ macro_rules! __pinned_drop {
|
||||||
unsafe $($impl_sig)* {
|
unsafe $($impl_sig)* {
|
||||||
// Inherit all attributes and the type/ident tokens for the signature.
|
// Inherit all attributes and the type/ident tokens for the signature.
|
||||||
$(#[$($attr)*])*
|
$(#[$($attr)*])*
|
||||||
fn drop($($sig)*, _: $crate::init::__internal::OnlyCallFromDrop) {
|
fn drop($($sig)*, _: $crate::__internal::OnlyCallFromDrop) {
|
||||||
$($inner)*
|
$($inner)*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -865,7 +868,7 @@ macro_rules! __pin_data {
|
||||||
// SAFETY: We have added the correct projection functions above to `__ThePinData` and
|
// SAFETY: We have added the correct projection functions above to `__ThePinData` and
|
||||||
// we also use the least restrictive generics possible.
|
// we also use the least restrictive generics possible.
|
||||||
unsafe impl<$($impl_generics)*>
|
unsafe impl<$($impl_generics)*>
|
||||||
$crate::init::__internal::HasPinData for $name<$($ty_generics)*>
|
$crate::__internal::HasPinData for $name<$($ty_generics)*>
|
||||||
where $($whr)*
|
where $($whr)*
|
||||||
{
|
{
|
||||||
type PinData = __ThePinData<$($ty_generics)*>;
|
type PinData = __ThePinData<$($ty_generics)*>;
|
||||||
|
@ -877,7 +880,7 @@ macro_rules! __pin_data {
|
||||||
|
|
||||||
// SAFETY: TODO.
|
// SAFETY: TODO.
|
||||||
unsafe impl<$($impl_generics)*>
|
unsafe impl<$($impl_generics)*>
|
||||||
$crate::init::__internal::PinData for __ThePinData<$($ty_generics)*>
|
$crate::__internal::PinData for __ThePinData<$($ty_generics)*>
|
||||||
where $($whr)*
|
where $($whr)*
|
||||||
{
|
{
|
||||||
type Datee = $name<$($ty_generics)*>;
|
type Datee = $name<$($ty_generics)*>;
|
||||||
|
@ -936,7 +939,7 @@ macro_rules! __pin_data {
|
||||||
// `PinnedDrop` as the parameter to `#[pin_data]`.
|
// `PinnedDrop` as the parameter to `#[pin_data]`.
|
||||||
#[expect(non_camel_case_types)]
|
#[expect(non_camel_case_types)]
|
||||||
trait UselessPinnedDropImpl_you_need_to_specify_PinnedDrop {}
|
trait UselessPinnedDropImpl_you_need_to_specify_PinnedDrop {}
|
||||||
impl<T: $crate::init::PinnedDrop>
|
impl<T: $crate::PinnedDrop>
|
||||||
UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for T {}
|
UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for T {}
|
||||||
impl<$($impl_generics)*>
|
impl<$($impl_generics)*>
|
||||||
UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for $name<$($ty_generics)*>
|
UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for $name<$($ty_generics)*>
|
||||||
|
@ -959,8 +962,8 @@ macro_rules! __pin_data {
|
||||||
let pinned = unsafe { ::core::pin::Pin::new_unchecked(self) };
|
let pinned = unsafe { ::core::pin::Pin::new_unchecked(self) };
|
||||||
// SAFETY: Since this is a drop function, we can create this token to call the
|
// SAFETY: Since this is a drop function, we can create this token to call the
|
||||||
// pinned destructor of this type.
|
// pinned destructor of this type.
|
||||||
let token = unsafe { $crate::init::__internal::OnlyCallFromDrop::new() };
|
let token = unsafe { $crate::__internal::OnlyCallFromDrop::new() };
|
||||||
$crate::init::PinnedDrop::drop(pinned, token);
|
$crate::PinnedDrop::drop(pinned, token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1000,10 +1003,10 @@ macro_rules! __pin_data {
|
||||||
$pvis unsafe fn $p_field<E>(
|
$pvis unsafe fn $p_field<E>(
|
||||||
self,
|
self,
|
||||||
slot: *mut $p_type,
|
slot: *mut $p_type,
|
||||||
init: impl $crate::init::PinInit<$p_type, E>,
|
init: impl $crate::PinInit<$p_type, E>,
|
||||||
) -> ::core::result::Result<(), E> {
|
) -> ::core::result::Result<(), E> {
|
||||||
// SAFETY: TODO.
|
// SAFETY: TODO.
|
||||||
unsafe { $crate::init::PinInit::__pinned_init(init, slot) }
|
unsafe { $crate::PinInit::__pinned_init(init, slot) }
|
||||||
}
|
}
|
||||||
)*
|
)*
|
||||||
$(
|
$(
|
||||||
|
@ -1011,10 +1014,10 @@ macro_rules! __pin_data {
|
||||||
$fvis unsafe fn $field<E>(
|
$fvis unsafe fn $field<E>(
|
||||||
self,
|
self,
|
||||||
slot: *mut $type,
|
slot: *mut $type,
|
||||||
init: impl $crate::init::Init<$type, E>,
|
init: impl $crate::Init<$type, E>,
|
||||||
) -> ::core::result::Result<(), E> {
|
) -> ::core::result::Result<(), E> {
|
||||||
// SAFETY: TODO.
|
// SAFETY: TODO.
|
||||||
unsafe { $crate::init::Init::__init(init, slot) }
|
unsafe { $crate::Init::__init(init, slot) }
|
||||||
}
|
}
|
||||||
)*
|
)*
|
||||||
}
|
}
|
||||||
|
@ -1131,15 +1134,15 @@ macro_rules! __init_internal {
|
||||||
//
|
//
|
||||||
// SAFETY: TODO.
|
// SAFETY: TODO.
|
||||||
let data = unsafe {
|
let data = unsafe {
|
||||||
use $crate::init::__internal::$has_data;
|
use $crate::__internal::$has_data;
|
||||||
// Here we abuse `paste!` to retokenize `$t`. Declarative macros have some internal
|
// Here we abuse `paste!` to retokenize `$t`. Declarative macros have some internal
|
||||||
// information that is associated to already parsed fragments, so a path fragment
|
// information that is associated to already parsed fragments, so a path fragment
|
||||||
// cannot be used in this position. Doing the retokenization results in valid rust
|
// cannot be used in this position. Doing the retokenization results in valid rust
|
||||||
// code.
|
// code.
|
||||||
$crate::init::macros::paste!($t::$get_data())
|
$crate::macros::paste!($t::$get_data())
|
||||||
};
|
};
|
||||||
// Ensure that `data` really is of type `$data` and help with type inference:
|
// Ensure that `data` really is of type `$data` and help with type inference:
|
||||||
let init = $crate::init::__internal::$data::make_closure::<_, __InitOk, $err>(
|
let init = $crate::__internal::$data::make_closure::<_, __InitOk, $err>(
|
||||||
data,
|
data,
|
||||||
move |slot| {
|
move |slot| {
|
||||||
{
|
{
|
||||||
|
@ -1149,7 +1152,7 @@ macro_rules! __init_internal {
|
||||||
// error when fields are missing (since they will be zeroed). We also have to
|
// error when fields are missing (since they will be zeroed). We also have to
|
||||||
// check that the type actually implements `Zeroable`.
|
// check that the type actually implements `Zeroable`.
|
||||||
$({
|
$({
|
||||||
fn assert_zeroable<T: $crate::init::Zeroable>(_: *mut T) {}
|
fn assert_zeroable<T: $crate::Zeroable>(_: *mut T) {}
|
||||||
// Ensure that the struct is indeed `Zeroable`.
|
// Ensure that the struct is indeed `Zeroable`.
|
||||||
assert_zeroable(slot);
|
assert_zeroable(slot);
|
||||||
// SAFETY: The type implements `Zeroable` by the check above.
|
// SAFETY: The type implements `Zeroable` by the check above.
|
||||||
|
@ -1186,7 +1189,7 @@ macro_rules! __init_internal {
|
||||||
init(slot).map(|__InitOk| ())
|
init(slot).map(|__InitOk| ())
|
||||||
};
|
};
|
||||||
// SAFETY: TODO.
|
// SAFETY: TODO.
|
||||||
let init = unsafe { $crate::init::$construct_closure::<_, $err>(init) };
|
let init = unsafe { $crate::$construct_closure::<_, $err>(init) };
|
||||||
init
|
init
|
||||||
}};
|
}};
|
||||||
(init_slot($($use_data:ident)?):
|
(init_slot($($use_data:ident)?):
|
||||||
|
@ -1217,10 +1220,10 @@ macro_rules! __init_internal {
|
||||||
//
|
//
|
||||||
// We rely on macro hygiene to make it impossible for users to access this local variable.
|
// We rely on macro hygiene to make it impossible for users to access this local variable.
|
||||||
// We use `paste!` to create new hygiene for `$field`.
|
// We use `paste!` to create new hygiene for `$field`.
|
||||||
$crate::init::macros::paste! {
|
$crate::macros::paste! {
|
||||||
// SAFETY: We forget the guard later when initialization has succeeded.
|
// SAFETY: We forget the guard later when initialization has succeeded.
|
||||||
let [< __ $field _guard >] = unsafe {
|
let [< __ $field _guard >] = unsafe {
|
||||||
$crate::init::__internal::DropGuard::new(::core::ptr::addr_of_mut!((*$slot).$field))
|
$crate::__internal::DropGuard::new(::core::ptr::addr_of_mut!((*$slot).$field))
|
||||||
};
|
};
|
||||||
|
|
||||||
$crate::__init_internal!(init_slot($use_data):
|
$crate::__init_internal!(init_slot($use_data):
|
||||||
|
@ -1243,15 +1246,15 @@ macro_rules! __init_internal {
|
||||||
//
|
//
|
||||||
// SAFETY: `slot` is valid, because we are inside of an initializer closure, we
|
// SAFETY: `slot` is valid, because we are inside of an initializer closure, we
|
||||||
// return when an error/panic occurs.
|
// return when an error/panic occurs.
|
||||||
unsafe { $crate::init::Init::__init(init, ::core::ptr::addr_of_mut!((*$slot).$field))? };
|
unsafe { $crate::Init::__init(init, ::core::ptr::addr_of_mut!((*$slot).$field))? };
|
||||||
// Create the drop guard:
|
// Create the drop guard:
|
||||||
//
|
//
|
||||||
// We rely on macro hygiene to make it impossible for users to access this local variable.
|
// We rely on macro hygiene to make it impossible for users to access this local variable.
|
||||||
// We use `paste!` to create new hygiene for `$field`.
|
// We use `paste!` to create new hygiene for `$field`.
|
||||||
$crate::init::macros::paste! {
|
$crate::macros::paste! {
|
||||||
// SAFETY: We forget the guard later when initialization has succeeded.
|
// SAFETY: We forget the guard later when initialization has succeeded.
|
||||||
let [< __ $field _guard >] = unsafe {
|
let [< __ $field _guard >] = unsafe {
|
||||||
$crate::init::__internal::DropGuard::new(::core::ptr::addr_of_mut!((*$slot).$field))
|
$crate::__internal::DropGuard::new(::core::ptr::addr_of_mut!((*$slot).$field))
|
||||||
};
|
};
|
||||||
|
|
||||||
$crate::__init_internal!(init_slot():
|
$crate::__init_internal!(init_slot():
|
||||||
|
@ -1280,10 +1283,10 @@ macro_rules! __init_internal {
|
||||||
//
|
//
|
||||||
// We rely on macro hygiene to make it impossible for users to access this local variable.
|
// We rely on macro hygiene to make it impossible for users to access this local variable.
|
||||||
// We use `paste!` to create new hygiene for `$field`.
|
// We use `paste!` to create new hygiene for `$field`.
|
||||||
$crate::init::macros::paste! {
|
$crate::macros::paste! {
|
||||||
// SAFETY: We forget the guard later when initialization has succeeded.
|
// SAFETY: We forget the guard later when initialization has succeeded.
|
||||||
let [< __ $field _guard >] = unsafe {
|
let [< __ $field _guard >] = unsafe {
|
||||||
$crate::init::__internal::DropGuard::new(::core::ptr::addr_of_mut!((*$slot).$field))
|
$crate::__internal::DropGuard::new(::core::ptr::addr_of_mut!((*$slot).$field))
|
||||||
};
|
};
|
||||||
|
|
||||||
$crate::__init_internal!(init_slot($($use_data)?):
|
$crate::__init_internal!(init_slot($($use_data)?):
|
||||||
|
@ -1317,7 +1320,7 @@ macro_rules! __init_internal {
|
||||||
// information that is associated to already parsed fragments, so a path fragment
|
// information that is associated to already parsed fragments, so a path fragment
|
||||||
// cannot be used in this position. Doing the retokenization results in valid rust
|
// cannot be used in this position. Doing the retokenization results in valid rust
|
||||||
// code.
|
// code.
|
||||||
$crate::init::macros::paste!(
|
$crate::macros::paste!(
|
||||||
::core::ptr::write($slot, $t {
|
::core::ptr::write($slot, $t {
|
||||||
$($acc)*
|
$($acc)*
|
||||||
..zeroed
|
..zeroed
|
||||||
|
@ -1341,7 +1344,7 @@ macro_rules! __init_internal {
|
||||||
// information that is associated to already parsed fragments, so a path fragment
|
// information that is associated to already parsed fragments, so a path fragment
|
||||||
// cannot be used in this position. Doing the retokenization results in valid rust
|
// cannot be used in this position. Doing the retokenization results in valid rust
|
||||||
// code.
|
// code.
|
||||||
$crate::init::macros::paste!(
|
$crate::macros::paste!(
|
||||||
::core::ptr::write($slot, $t {
|
::core::ptr::write($slot, $t {
|
||||||
$($acc)*
|
$($acc)*
|
||||||
});
|
});
|
||||||
|
@ -1396,12 +1399,12 @@ macro_rules! __derive_zeroable {
|
||||||
) => {
|
) => {
|
||||||
// SAFETY: Every field type implements `Zeroable` and padding bytes may be zero.
|
// SAFETY: Every field type implements `Zeroable` and padding bytes may be zero.
|
||||||
#[automatically_derived]
|
#[automatically_derived]
|
||||||
unsafe impl<$($impl_generics)*> $crate::init::Zeroable for $name<$($ty_generics)*>
|
unsafe impl<$($impl_generics)*> $crate::Zeroable for $name<$($ty_generics)*>
|
||||||
where
|
where
|
||||||
$($($whr)*)?
|
$($($whr)*)?
|
||||||
{}
|
{}
|
||||||
const _: () = {
|
const _: () = {
|
||||||
fn assert_zeroable<T: ?::core::marker::Sized + $crate::init::Zeroable>() {}
|
fn assert_zeroable<T: ?::core::marker::Sized + $crate::Zeroable>() {}
|
||||||
fn ensure_zeroable<$($impl_generics)*>()
|
fn ensure_zeroable<$($impl_generics)*>()
|
||||||
where $($($whr)*)?
|
where $($($whr)*)?
|
||||||
{
|
{
|
||||||
|
|
|
@ -95,7 +95,7 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs):
|
||||||
|
|
||||||
append_crate(
|
append_crate(
|
||||||
"pin_init_internal",
|
"pin_init_internal",
|
||||||
srctree / "rust" / "pin-init" / "internal" / "src" / "_lib.rs",
|
srctree / "rust" / "pin-init" / "internal" / "src" / "lib.rs",
|
||||||
[],
|
[],
|
||||||
cfg=["kernel"],
|
cfg=["kernel"],
|
||||||
is_proc_macro=True,
|
is_proc_macro=True,
|
||||||
|
@ -103,7 +103,7 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs):
|
||||||
|
|
||||||
append_crate(
|
append_crate(
|
||||||
"pin_init",
|
"pin_init",
|
||||||
srctree / "rust" / "pin-init" / "src" / "_lib.rs",
|
srctree / "rust" / "pin-init" / "src" / "lib.rs",
|
||||||
["core", "pin_init_internal", "macros"],
|
["core", "pin_init_internal", "macros"],
|
||||||
cfg=["kernel"],
|
cfg=["kernel"],
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Reference in a new issue