scheduler: spawn_monitor / spawn_monitor_with — monitor registered on the child's slot before publish, so the Down always carries the real reason (spawn-then-monitor could race to NoProc); tests; channel test uses it

This commit is contained in:
claude-asm-audit
2026-08-21 12:23:46 +00:00
parent ea2b222cff
commit bc0a5e8656
6 changed files with 127 additions and 16 deletions
+5 -11
View File
@@ -137,19 +137,13 @@ fn channel_ops_interleaved_with_monitor_churn_multi_thread() {
for i in 0..32i64 {
let tx = tx.clone();
handles.push(spawn(move || {
// Short-lived target whose death fires the monitor below. It
// waits for `go` so the monitor is registered before it can
// die — otherwise a fast target yields an immediate NoProc
// Down instead of the finalize-sent Exit this test is about
// (pre-existing ~8% flake at 4 threads, independent of the
// wake slot).
let (go_tx, go_rx) = channel::<()>();
let t = spawn(move || {
let _ = go_rx.recv();
// Short-lived target whose death fires the monitor below.
// spawn_monitor: registered before publish, so the Down is
// the finalize-sent Exit this test is about, never NoProc
// (spawn-then-monitor raced ~8% at 4 threads).
let (t, m) = smarm::spawn_monitor(move || {
tx.send(i).unwrap();
});
let m = smarm::monitor(t.pid());
go_tx.send(()).unwrap();
t.join().unwrap();
// Down delivery exercises send-from-finalize.
let d = m.rx.recv().unwrap();