feat(introspect,runtime): per-actor stack surface on ActorInfo (RFC 019 §8)
- introspect::StackInfo { reserve, guard, depth_high_water,
parks_since_shrink, shrinks } as ActorInfo.stack; re-exported at crate
root beside ActorInfo.
- All reads lock-free: geometry from the c6 diag slot atomics, depth =
top - hwm (the §2 sampled high-water; doc spells out sampled-not-exact
and that 0 means never-descheduled-at-depth), counters straight off the
§3 atomics. Coherence for the incarnation rides read_slot's existing
generation check, same as overruns/messages_received.
- Slot::stack_introspect(): one pub(crate) tuple accessor beside the other
counter accessors.
- Exact RSS deliberately absent per RFC (mincore = debug tooling only,
never a runtime path); stack_shape(pid) untouched (cold-lock exact
variant from c2).
- tests/introspect.rs: defaults surface (64 KiB reserve / 1 MiB guard /
sampled ~32 KiB depth / gate park counted / zero shrinks) + live shrink
counters (spike visible pre-shrink; shrinks>=1, cooldown counter reset,
hwm reset after crossing COOLDOWN) read mid-run -- post-join the slot
reclaim correctly hides the incarnation, which the first draft of the
test learned the hard way.
FLAGGED (Claude-solo calls):
- Nested StackInfo struct over five flat ActorInfo fields (grain break;
the five fields are one concern and ActorInfo is already 12 fields).
- Field names reserve/guard/shrinks (RFC says stack_reserve/stack_guard/
shrink count; the stack_ prefix is redundant inside StackInfo).
This commit is contained in:
@@ -662,6 +662,23 @@ impl Slot {
|
||||
|
||||
/// Read the overrun tally (Relaxed; the snapshot reads cross-thread).
|
||||
#[inline]
|
||||
/// RFC 019 §8 — the stack introspection tuple, all lock-free:
|
||||
/// `(reserve, guard, top, hwm, parks_since_shrink, shrink_count)`.
|
||||
/// Geometry from the c6 diag atomics (install-time, gen-coherent under
|
||||
/// `read_slot`'s gen check exactly like the other counters); `hwm` is the
|
||||
/// §2 sampled high-water (lowest saved sp). All zeros before first
|
||||
/// install.
|
||||
pub(crate) fn stack_introspect(&self) -> (usize, usize, usize, usize, u32, u32) {
|
||||
(
|
||||
self.diag_stack_reserve.load(Ordering::Relaxed),
|
||||
self.diag_stack_guard.load(Ordering::Relaxed),
|
||||
self.diag_stack_top.load(Ordering::Relaxed),
|
||||
self.hwm.load(Ordering::Relaxed),
|
||||
self.parks_since_shrink.load(Ordering::Relaxed),
|
||||
self.shrink_count.load(Ordering::Relaxed),
|
||||
)
|
||||
}
|
||||
|
||||
pub(crate) fn overruns(&self) -> u64 {
|
||||
self.overruns.load(Ordering::Relaxed)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user