use std::fmt;
use super::{FlashInner, Registry, sched::WaitKind, wake::Wake};
fn write_waiter_detail(
f: &mut fmt::Formatter<'_>,
kind: &WaitKind,
wake: &Wake,
reg: &Registry,
) -> fmt::Result {
if let WaitKind::Condvar(cvid) = kind
&& let Some(d) = reg.cv_desc.get(&cvid.0)
{
write!(
f,
" prim={:?} created_at={} by {}",
d.kind,
d.created_at,
d.created_on.as_deref().unwrap_or("<unnamed>"),
)?;
}
if let Some((task_id, loc)) = wake.task() {
write!(f, " task={task_id} spawned_at={loc}")?;
}
Ok(())
}
impl fmt::Display for FlashInner {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let now = self.clock.now_nanos();
let Ok(s) = self.core.try_lock() else {
return write!(
f,
"virtual_now_ns={now}; engine core lock held — engine mid-operation"
);
};
writeln!(
f,
"virtual_now_ns={now} active={} active_async={} real_io={} pace_anchor={} yielders={}",
s.registry.active,
s.registry.active_async,
s.sched.real_io,
if s.sched.pace_anchor.is_some() {
"set"
} else {
"none"
},
s.sched.yielders.len(),
)?;
for (id, loc) in &s.registry.active_async_holders {
writeln!(f, " active_async holder task={id} spawned_at={loc}")?;
}
for (key, holder) in &s.registry.active_sync_holders {
writeln!(
f,
" active holder thread={key:?} name={}",
holder.name.as_deref().unwrap_or("<unnamed>"),
)?;
}
for ((deadline, id), entry) in &s.sched.timed {
write!(
f,
" timed id={id:?} kind={:?} deadline_in_ns={}",
entry.kind,
deadline.saturating_sub(now),
)?;
write_waiter_detail(f, &entry.kind, &entry.wake, &s.registry)?;
writeln!(f)?;
}
for (id, entry) in &s.sched.indef {
write!(f, " indef id={id:?} kind={:?}", entry.kind)?;
write_waiter_detail(f, &entry.kind, &entry.wake, &s.registry)?;
writeln!(f)?;
}
if !s.registry.cv_desc.is_empty() {
writeln!(f, " engine primitives ({}):", s.registry.cv_desc.len())?;
for (cvid, d) in &s.registry.cv_desc {
writeln!(
f,
" cvid={cvid} {:?} created_at={} by {}",
d.kind,
d.created_at,
d.created_on.as_deref().unwrap_or("<unnamed>"),
)?;
}
}
if !s.sched.unpark_pending.is_empty() {
writeln!(f, " unpark_pending={:?}", s.sched.unpark_pending)?;
}
if !s.sched.notify_permits.is_empty() {
writeln!(f, " notify_permits={:?}", s.sched.notify_permits)?;
}
Ok(())
}
}