Stage O-C: the event-driven DoE driver -- DOE returns to the prompt, EV-DONE chains the trials, MU-WAIT-ALL deleted (FABRIC-3.9.0 §3/§7.4)

- DOE sets up, JOINs EV-DONE and starts trial 1, then returns. Each trial
  births and sends WL-RUN only; completion arrives as the OS's EV-DONE.
- ON-DONE counts this campaign's own workers while active; the last one
  ends the trial (KILL all, marker, persist) and starts the next, or
  finishes (HB-OFF, UNJOIN, MU-CAMPAIGN: complete). MU-WAIT-ALL is gone;
  the start/end cycle goes through MU-END-XT.
- WL-DONE-ARGS removed from all ten workload capsules; lint passes.

Smoke campaign (amd64, 1 rep, rows off per Captain Bob): DOE returns, the
prompt answers mid-trial, all 6 trials chain on events, fail=0 each,
28/28 born/killed/departed, MU-CAMPAIGN: complete in ~61 min. Standard
sequence passes on all three ISAs (with the xHCI fix it exposed, df150e86).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Robert Allan James
2026-09-25 10:58:11 -04:00
co-authored by Claude Opus 5.5
parent df150e8626
commit ac42cf36b5
16 changed files with 463807 additions and 123 deletions
+49 -38
View File
@@ -29,14 +29,13 @@ Block 5045
ENDCASE ;
Block 5046
( FABRIC-3.8 3.9 Stage H: workers are born defs-only and )
( each is SENT one job. WL-RUN, defined in every workload )
( capsule, is its old birth-time tail plus its entry word )
( twice, as the old two VM-EXEC passes did. The LAST word )
( of the job SENDs MU-DONE back to Hera, who counts them. )
( FABRIC-3.9.8 O-C: event-driven. Workers are born defs-only )
( and each is SENT one job: WL-RUN, nothing else. Its end )
( reaches Hera as the OS's own EV-DONE (ON-DONE, block 5054) )
( -- no job text SENDs anything, and Hera never waits. )
VARIABLE MU-DONE-COUNT
: MU-DONE ( -- ) MU-DONE-COUNT @ 1+ MU-DONE-COUNT ! ;
: MU-JOB ( -- c-addr u ) S" WL-RUN WL-DONE-ARGS SEND" ;
VARIABLE MU-ACTIVE
: MU-JOB ( -- c-addr u ) S" WL-RUN" ;
Block 5047
: MU-WORKER-NAME ( n -- c-addr u )
@@ -66,9 +65,9 @@ Block 5049
VARIABLE MU-FAIL-COUNT
: MU-SEND-WORKER ( worker-n -- )
MU-JOB ROT MU-WORKER-NAME SEND 0= IF
MU-FAIL-COUNT @ 1+ MU-FAIL-COUNT ! MU-DONE THEN ;
: MU-KILL-WORKER ( worker-n -- )
MU-WORKER-NAME KILL ;
MU-FAIL-COUNT @ 1+ MU-FAIL-COUNT !
MU-DONE-COUNT @ 1+ MU-DONE-COUNT ! THEN ;
: MU-KILL-WORKER ( worker-n -- ) MU-WORKER-NAME KILL ;
CREATE MU-RUN-MATRIX MU-MAX-RUNS CELLS ALLOT
: MU-MATRIX! ( val idx -- ) CELLS MU-RUN-MATRIX + ! ;
: MU-MATRIX@ ( idx -- val ) CELLS MU-RUN-MATRIX + @ ;
@@ -119,45 +118,57 @@ Block 5052
MU-NW @ 0 DO
I MU-SEND-WORKER
LOOP ;
: MU-WAIT-ALL ( -- )
BEGIN MU-DONE-COUNT @ MU-NW @ < WHILE REPEAT ;
( O-C: MU-WAIT-ALL is gone. The trial's end runs through )
( MU-END-XT, set after MU-END-TRIAL is defined, breaking the )
( start -> send -> end -> start cycle in definition order. )
VARIABLE MU-END-XT
: MU-CHECK-END ( -- )
MU-DONE-COUNT @ MU-NW @ < 0= IF MU-END-XT @ EXECUTE THEN ;
Block 5053
: MU-KILL-ALL ( -- )
MU-NW @ 0 DO
I MU-KILL-WORKER
LOOP ;
: MU-RUN-TRIAL ( cfg rep run-id -- )
MU-RUN-ID ! MU-REP ! MU-CFG !
( O-C: a trial STARTS -- births, sends, returns. It ends in )
( MU-END-TRIAL, run from ON-DONE when the last worker is done. )
: MU-START-TRIAL ( cfg rep -- )
MU-REP ! MU-CFG !
0 MU-FAIL-COUNT ! 0 MU-DONE-COUNT !
MU-CFG @ MU-CONC-OF MU-NW !
MU-CFG @ MU-MODE-OF MU-MODE !
MU-BIRTH-ALL
MU-SEND-ALL
MU-WAIT-ALL
MU-KILL-ALL
MU-EMIT-TRIAL-MARKER ;
MU-BIRTH-ALL MU-SEND-ALL
MU-CHECK-END ;
Block 5054
: MU-CAMPAIGN-STEP ( idx -- )
MU-MATRIX@
DUP MU-NREPS @ /
SWAP MU-NREPS @ MOD
MU-RUN-ID @
MU-RUN-TRIAL
MU-RUN-ID @ 1+ MU-RUN-ID ! ;
VARIABLE MU-IDX
: MU-START-IDX ( -- )
MU-IDX @ MU-MATRIX@
DUP MU-NREPS @ / SWAP MU-NREPS @ MOD
MU-START-TRIAL ;
: MU-FINISH ( -- )
0 MU-ACTIVE ! HB-OFF EV-DONE UNJOIN DROP
." MU-CAMPAIGN: complete" CR ;
: MU-END-TRIAL ( -- )
MU-KILL-ALL MU-EMIT-TRIAL-MARKER
MU-RUN-ID @ 1+ MU-RUN-ID ! MU-IDX @ 1+ MU-IDX !
MU-IDX @ MU-N-RUNS @ < IF MU-START-IDX
ELSE MU-FINISH THEN ;
' MU-END-TRIAL MU-END-XT !
Block 5055
( EV-DONE handler: count only this campaign's own workers, )
( mu0..mu7, and only while a campaign is running. )
: MU-OURS? ( c-addr u -- f )
2 < IF DROP 0 EXIT THEN
DUP C@ 109 = SWAP 1+ C@ 117 = AND ;
: ON-DONE ( c-addr u -- )
MU-ACTIVE @ 0= IF 2DROP EXIT THEN
MU-OURS? 0= IF EXIT THEN
MU-DONE-COUNT @ 1+ MU-DONE-COUNT ! MU-CHECK-END ;
: MU-EXEC-CAMPAIGN ( seed n-reps start-idx -- )
>R
DUP MU-NREPS !
MU-N-CFG * MU-N-RUNS !
SEED
MU-INIT-MATRIX MU-SHUFFLE
HB-ON
R@ MU-RUN-ID !
MU-N-RUNS @ R> DO
I MU-CAMPAIGN-STEP
LOOP
HB-OFF
." MU-CAMPAIGN: complete" CR ;
MU-IDX ! DUP MU-NREPS ! MU-N-CFG * MU-N-RUNS ! SEED
MU-INIT-MATRIX MU-SHUFFLE HB-ON MU-IDX @ MU-RUN-ID !
MU-IDX @ MU-N-RUNS @ < IF
EV-DONE JOIN DROP 1 MU-ACTIVE ! MU-START-IDX
ELSE MU-FINISH THEN ;