#[cfg(feature = "registry-diagnostics")]
use std::time::Duration;
#[cfg(feature = "registry-diagnostics")]
use super::registry::TaskRegistry;
#[cfg(feature = "registry-diagnostics")]
use super::state::{task_location, TaskState, TIMESTAMP_NOT_RECORDED};
#[cfg(feature = "registry-diagnostics")]
impl TaskRegistry {
#[doc(hidden)]
#[cold]
#[inline(never)]
pub fn diagnostic_block_lookup(&mut self) -> u64 {
let id = self.next_id;
self.next_id = self.next_id.saturating_add(1);
let (block_index, slot_index) = task_location(id);
self.ensure_block(block_index);
let slot_occupied = self.blocks[block_index].get(slot_index).is_some();
std::hint::black_box(slot_occupied);
id
}
#[doc(hidden)]
#[cold]
#[inline(never)]
pub fn diagnostic_slot_initialize(&mut self) -> u64 {
let id = self.next_id;
self.next_id = self.next_id.saturating_add(1);
let (block_index, slot_index) = task_location(id);
self.ensure_block(block_index);
let _ = self.blocks[block_index].insert(slot_index);
id
}
#[doc(hidden)]
#[cold]
#[inline(never)]
pub fn diagnostic_lifecycle_timestamp_publication() -> Duration {
let state = TaskState::new();
let started_after_ns = state.mark_started(0);
state.mark_completed_since(started_after_ns)
}
#[doc(hidden)]
#[cold]
#[inline(never)]
pub fn diagnostic_task_state_construct() -> usize {
let state = TaskState::new();
std::hint::black_box(state);
core::mem::size_of::<TaskState>()
}
#[doc(hidden)]
#[cold]
#[inline(never)]
pub fn diagnostic_mark_started(&self, task_id: u64, worker_id: usize) -> u64 {
self.state(task_id).map_or(TIMESTAMP_NOT_RECORDED, |state| {
state.mark_started(worker_id)
})
}
#[doc(hidden)]
#[cold]
#[inline(never)]
pub fn diagnostic_mark_completed_since(&self, task_id: u64, started_after_ns: u64) -> Duration {
self.state(task_id).map_or(Duration::ZERO, |state| {
state.mark_completed_since(started_after_ns)
})
}
#[doc(hidden)]
pub fn diagnostic_register_next_and_complete_with_token(&mut self) -> Duration {
let id = self.next_id;
let lifecycle = self.register_task_with_id(id);
lifecycle.start(0).complete()
}
#[doc(hidden)]
pub fn diagnostic_register_next_and_complete_with_token_id(&mut self) -> (u64, Duration) {
let id = self.next_id;
let lifecycle = self.register_task_with_id(id);
(id, lifecycle.start(0).complete())
}
}