use core::mem::MaybeUninit; use core::ptr; use std::task::Waker;
const NUM_WAKERS: usize = 32;
/// A list of wakers to be woken. /// /// # Invariants /// /// The first `curr` elements of `inner` are initialized. pub(crate) struct WakeList {
inner: [MaybeUninit<Waker>; NUM_WAKERS],
curr: usize,
}
impl Drop for DropGuard { fn drop(&mutself) { // SAFETY: Both pointers are part of the same object, with `start <= end`. let len = unsafe { self.end.offset_from(self.start) } as usize; let slice = ptr::slice_from_raw_parts_mut(self.start, len); // SAFETY: All elements in `start..len` are initialized, so we can drop them. unsafe { ptr::drop_in_place(slice) };
}
}
debug_assert!(self.curr <= NUM_WAKERS);
letmut guard = { let start = self.inner.as_mut_ptr().cast::<Waker>(); // SAFETY: The resulting pointer is in bounds or one after the length of the same object. let end = unsafe { start.add(self.curr) }; // Transfer ownership of the wakers in `inner` to `DropGuard`. self.curr = 0;
DropGuard { start, end }
}; while !ptr::eq(guard.start, guard.end) { // SAFETY: `start` is always initialized if `start != end`. let waker = unsafe { ptr::read(guard.start) }; // SAFETY: The resulting pointer is in bounds or one after the length of the same object.
guard.start = unsafe { guard.start.add(1) }; // If this panics, then `guard` will clean up the remaining wakers.
waker.wake();
}
}
}
impl Drop for WakeList { fn drop(&mutself) { let slice =
ptr::slice_from_raw_parts_mut(self.inner.as_mut_ptr().cast::<Waker>(), self.curr); // SAFETY: The first `curr` elements are initialized, so we can drop them. unsafe { ptr::drop_in_place(slice) };
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-19)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.