#![no_std]
use core::task::Waker;
const ITEM_WORDS: usize = if cfg!(feature = "timer-item-size-8-words") {
8
} else if cfg!(feature = "timer-item-size-6-words") {
6
} else if cfg!(feature = "timer-item-size-4-words") {
4
} else {
0
};
#[repr(align(8))]
pub struct TimerQueueItem {
data: [usize; ITEM_WORDS],
}
impl TimerQueueItem {
pub const fn new() -> Self {
Self { data: [0; ITEM_WORDS] }
}
pub unsafe fn from_embassy_waker(waker: &Waker) -> &'static mut Self {
unsafe extern "Rust" {
fn __embassy_time_queue_item_from_waker(waker: &Waker) -> &'static mut TimerQueueItem;
}
unsafe { __embassy_time_queue_item_from_waker(waker) }
}
pub unsafe fn as_ref<T>(&self) -> &T {
const { validate::<T>() }
unsafe { &*(self.data.as_ptr() as *const T) }
}
pub unsafe fn as_mut<T>(&self) -> &mut T {
const { validate::<T>() }
unsafe { &mut *(self.data.as_ptr() as *mut T) }
}
}
const fn validate<T>() {
const {
assert!(
core::mem::size_of::<TimerQueueItem>() >= core::mem::size_of::<T>(),
"embassy-executor-timer-queue item size is smaller than the requested type. Select a larger timer-item-size-N-words feature."
);
assert!(
core::mem::align_of::<TimerQueueItem>() >= core::mem::align_of::<T>(),
"the alignment of the requested type is greater than 8"
);
}
}