Related: #791, #794. GC correctness prerequisite found by the full sharded unit run for #794.
The existing enable_gc concurrent (M3): generators and iterator helpers are safe under concurrent marking test failed with TypeError: generator is already running, originating at genResume's resume_mutex.tryLock() check. The workload has one JS mutator and no recursive generator resume. A focused replay passed, so this needs a deterministic ownership witness, not retries as acceptance.
Both mechanisms are already present on parent main 8d772d1:
Generator.tryLockTraceholdsresume_mutexwhile a background marker traces an idle activation.genResumetreats any inability to acquire that mutex as JavaScript re-entry.
The collector's temporary lock ownership is not an executing generator. Separate the JS/native resume claim from the collector's short tracing lock, preserve real recursive/concurrent resume rejection, and preserve per-cell native-address pinning and root-allocation failure cleanup. Do not suppress the exception, disable concurrent tracing, retry the JS operation, or change job/queue/lifecycle drivers.
Acceptance:
- Deterministic marker-owned-mutex witness fails on parent and passes with the fix.
- Real nested/concurrent
.next/.return/.throwre-entry still throws. - OOM, native moving-GC, concurrent marking, and TSan witnesses pass.
- Full sharded units and pushed integration evidence are recorded without discarding the initial failed run.
Completed integration
CI run 33113309062 completed successfully on main commit 8a1398ffc04e9e30987f968693667c7271ca3ce1, which contains this fix. All 53 executed jobs succeeded, including all four unit and TSan-unit shards, Linux no-GIL TSan, functional/no-GIL corpus gates, fuzz profiles, ABI, Wasm, Test262 parallel, and docs. The scheduled-only nightly job was skipped, not counted as a pass. The local evidence above plus this descendant integration run completes this issue's acceptance.