RFC 016 Chunk 2a: per-actor timeslice overrun counter
Tally overruns at the slice-expiry site in preempt.rs (the RFC 006 signal), surfaced as ActorInfo.overruns. - Counter is a hot-region AtomicU64 on Slot, single-writer Relaxed load+store (no atomic RMW), read Relaxed by the snapshot (D5). - Reached from the rare expiry branch via a stashed *const Slot in a preempt thread-local, set/cleared on the same resume/return boundary as CURRENT_STOP — one TLS load, no runtime lookup. Shared infra for the messages-received counter next. - Reset in all three slot-lifecycle sites: Slot::vacant, reclaim_slot, install_actor (standing invariant, D7) — per-incarnation counts.
This commit is contained in:
@@ -234,6 +234,7 @@ fn tree_from_nests_children_and_reroots_orphans() {
|
||||
links: 0,
|
||||
joiners: 0,
|
||||
mailbox_depth: 0,
|
||||
overruns: 0,
|
||||
};
|
||||
|
||||
let snap = RuntimeSnapshot {
|
||||
@@ -258,3 +259,30 @@ fn tree_from_nests_children_and_reroots_orphans() {
|
||||
assert!(o.orphaned, "an actor whose parent is absent must be flagged orphaned");
|
||||
assert!(o.children.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn overrun_count_increments_on_forced_preemption() {
|
||||
run(|| {
|
||||
// A worker that forces its slice to expire, then hits an observation
|
||||
// point so the slice-expiry site fires and tallies one overrun.
|
||||
let (ready_tx, ready_rx) = channel::<()>();
|
||||
let (gate_tx, gate_rx) = channel::<()>();
|
||||
let h = spawn(move || {
|
||||
smarm::preempt::expire_timeslice_for_test();
|
||||
smarm::check!(); // preempt-yield here → one overrun tallied
|
||||
ready_tx.send(()).unwrap();
|
||||
gate_rx.recv().unwrap();
|
||||
});
|
||||
ready_rx.recv().unwrap(); // worker is past the forced preemption
|
||||
|
||||
let info = actor_info(h.pid()).expect("worker present");
|
||||
assert!(
|
||||
info.overruns >= 1,
|
||||
"forced timeslice expiry should tally at least one overrun, got {}",
|
||||
info.overruns
|
||||
);
|
||||
|
||||
gate_tx.send(()).unwrap();
|
||||
h.join().unwrap();
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user