macro_rules! assert_pinned {
($ty:ty, $field:ident, $field_ty:ty, inline) => { ... };
($ty:ty, $field:ident, $field_ty:ty) => { ... };
}Expand description
Asserts that a field on a struct using #[pin_data] is marked with #[pin] ie. that it is
structurally pinned.
§Example
This will succeed:
use kernel::assert_pinned;
#[pin_data]
struct MyStruct {
#[pin]
some_field: u64,
}
assert_pinned!(MyStruct, some_field, u64);This will fail:
ⓘ
use kernel::assert_pinned;
#[pin_data]
struct MyStruct {
some_field: u64,
}
assert_pinned!(MyStruct, some_field, u64);Some uses of the macro may trigger the can't use generic parameters from outer item error. To
work around this, you may pass the inline parameter to the macro. The inline parameter can
only be used when the macro is invoked from a function body.
use kernel::assert_pinned;
#[pin_data]
struct Foo<T> {
#[pin]
elem: T,
}
impl<T> Foo<T> {
fn project(self: Pin<&mut Self>) -> Pin<&mut T> {
assert_pinned!(Foo<T>, elem, T, inline);
// SAFETY: The field is structurally pinned.
unsafe { self.map_unchecked_mut(|me| &mut me.elem) }
}
}