docs 22 + wx bump: DOM entries on the dispatch context; canvas tools green at D-on
The increment doc 22 ordered last round. Every entry that can reach a tool coroutine - the four DOM callbacks and the mailbox tick - now goes through the scheduler, so a coroutine is never entered by a star transfer from one path and a direct symmetric swap from another. At D-on all four canvas-tool specs are GREEN and the KiCad suite is 136/3 (was 135/5 before the sleep work, with the tools red throughout). context_sleep's wake learned the mirror lesson: now that the mailbox runs ON a context, it must NOT call drain_all from there (drain refuses re-entry, and should) - it marks ready and lets the outer drain_all perform the entry, with an armed pump as a backstop. Recorded honestly, not papered over: two of the three remaining D-on failures are the timer-park and quasimodal-strand levers, each failing ONE assertion - "scheduler shim observed the concurrent-park window", expected >0, got 0 - while fired/done/parked/errors all pass. That counter needs TWO concurrent in-place Asyncify parks, and the lever stages "timer park x MAIN-LOOP YIELD PARK"; D5 removed the main loop's Asyncify park, so the overlap cannot occur. Re-pinning those levers to the post-migration invariant is a Phase F decision alongside fiber-resume-park's red->green flip, NOT an assert to relax now. Landing state: STAR_DISPATCH=0, kicad 139 passed / 1 (pre-existing occ-probe). Next: Phase E - the K1-K7 bridges are the only in-place parks left under a context, and are exactly what the current()!=0 fallback still tolerates. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LBjomQfKyRa3jBdeAKpmTw
This commit is contained in:
parent
80468e7c5b
commit
ab6e44e57f
3 changed files with 78 additions and 4 deletions
|
|
@ -39,6 +39,8 @@
|
|||
|
||||
#include <wx/wasm/private/sched_context.h>
|
||||
|
||||
#include <emscripten/emscripten.h>
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
// The scheduler mailbox (wx/wasm/private/mailbox.h). A timer message is the
|
||||
|
|
@ -62,10 +64,28 @@ void wake_sleeper( void* aArg )
|
|||
const pcbjam_sched::ContextId id =
|
||||
static_cast<pcbjam_sched::ContextId>( reinterpret_cast<uintptr_t>( aArg ) );
|
||||
|
||||
// mark_ready never resumes inline (doc 13 §1.4); drain_all performs the
|
||||
// entry from this clean mailbox-tick stack.
|
||||
if( pcbjam_sched::mark_ready( id, 0 ) )
|
||||
// mark_ready never resumes inline (doc 13 §1.4). WHO performs the entry
|
||||
// depends on where this delivery landed:
|
||||
if( !pcbjam_sched::mark_ready( id, 0 ) )
|
||||
return;
|
||||
|
||||
if( pcbjam_sched::current() == 0 )
|
||||
{
|
||||
// On the scheduler stack: drain here.
|
||||
pcbjam_sched::drain_all();
|
||||
return;
|
||||
}
|
||||
|
||||
// Delivered ON a context — the mailbox tick itself now runs on a dispatch
|
||||
// context (doc 22 §10). drain() would refuse re-entry, and it should: the
|
||||
// outer drain_all that entered this context keeps pumping once it parks,
|
||||
// and picks up the context we just marked ready. Arm a pump anyway so a
|
||||
// delivery that reached here by some other route cannot strand it.
|
||||
EM_ASM( {
|
||||
setTimeout( function() {
|
||||
if( Module["_wxWasmSchedPump"] ) Module["_wxWasmSchedPump"]();
|
||||
}, 0 );
|
||||
} );
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
|||
Loading…
Reference in a new issue