Parallel GC mutators need write barriers, stack-map coverage, and scheduler coordination. Shipping partial parallel GC risks data races on the Abfall heap.
FAQ and troubleshooting
Platform spec article
FAQ and troubleshooting
Spec standingStandard
-
v0.2 targets single mutator; Phase B requires spec and barrier completion first.
Context
Decision
Phase Mutators Ship order A (v0.2) One Beskid mutator; many cooperative fibers Default ship B (v0.3, opt-in) Parallel mutators + real gc_write_barrieron pointer-payload channels + syscall-pool guardWired behind BESKID_RUNTIME_PHASE_B/set_runtime_phase(RuntimePhase::PhaseB); stays opt-in until preemption emission and concurrent-mark stress landB (later) Phase B becomes the default Requires AOT/JIT to insert runtime_preempt_checkprologues and full concurrent-mark stress coveragePhase B must not become the default without updating this feature hub and fiber scheduler contracts.
Consequences
Phase A barriers stay correct because Phase B reuses the same Dijkstra insertion barrier; the difference is that Phase B exercises it on multi-mutator workloads and on pointer-payload channel ops. Fiber/feature docs cross-link Phase tables.
Verification anchors
GC integration tests under
crates/beskid_runtime/tests/:tests/concurrency.rs— channel/scheduler coretests/gc.rs,tests/gc_concurrency.rs— Phase A heap and root handlestests/phase_b_concurrency.rs— Phase B multi-mutator stress, pointer-payload channels with write barriers, syscall-pool guard, optional preemption hook
Platform-spec Phase diagrams in hub and design model.
-
Reference runtime uses vendored Abfall mark/sweep with barriered stores.
Context
The prior arena model needed a collector that supports concurrent marking and precise scanning with compiler-emitted descriptors.
Decision
Component Role Abfall Tri-color mark/sweep heap integrated in beskid_runtime::gcBarriers gc_write_barrieron pointer stores during markingSTW Limited stop-the-world for root scan and phase transitions Snapshots GcSnapshot/enter_runtime_scopefor host toolingGit anchor:
6ecd493(vendored Abfall + Beskid heap integration).Consequences
Lowering must emit barriers where Phase requires them. Hosts attach runtime scope before JIT/AOT execution.
Verification anchors
compiler/crates/beskid_runtime/src/gc/; JIT runtime tests. -
alloc attaches descriptors; roots include stacks, globals, and handles.
Context
Conservative stack scanning alone is insufficient for precise Beskid object graphs across fibers and codegen optimizations.
Decision
Rule Detail Header Heap objects begin with a type descriptor pointer for precise scan Allocation alloc(size, type_desc)usesabfall::Heap::allocate_beskidStrings / arrays BeskidStr,BeskidArrayheaders per builtins layoutRoots Stacks (stack maps), globals (registered roots), gc_root_handleexternalsCompiler Lowers descriptors and stack maps; does not embed collector policy Consequences
Descriptor schema changes are ABI-visible per D-EXEC-ABI-0002.
Verification anchors
beskid_codegenstack maps;beskid_runtimealloc/GC tests.
- Contracts and edge cases MUST rules for allocation, barriers, roots, and Phase A mutator exclusivity.
- Design model Heap ownership, tri-color GC, Phase A mutator rules, and compiler/runtime split.
- Examples Allocation failures, GC pacing triggers, and external root pinning scenarios.
- FAQ and troubleshooting GC pauses, mutator violations, barrier omissions, and heap growth debugging.
- Flow and algorithm Allocation, barrier insertion, collection pacing, and safepoint algorithms.
- Verification and traceability Runtime GC tests, Abfall integration, and compiler stack-map obligations.
0 revisions (git unavailable at build; counts may be empty)
No commits recorded for this path.
| Section id | Required | Found |
|---|---|---|
what-this-feature-specifies | yes | yes |
implementation-anchors | yes | yes |
Full tree: run pnpm verify:platform-spec-layout (writes src/generated/platform-spec-layout-report.json).
Is gc_write_barrier a no-op today?
Section titled “Is gc_write_barrier a no-op today?”Barriers must remain in the ABI. Phase A may simplify runtime work when marking is off, but lowering still emits calls so Phase B does not require compiler flag days.
Can I call gc_collect from Beskid user code?
Section titled “Can I call gc_collect from Beskid user code?”Only through intentional runtime/corelib surfaces; arbitrary user calls bypass pacing policy and may STW unexpectedly. Host tooling and tests are the primary callers.
How does this relate to the language memory model?
Section titled “How does this relate to the language memory model?”Language rules define ownership and references; this feature defines runtime enforcement (allocation, tracing, barriers). See /platform-spec/language-meta/memory-model/.
When does Phase B land?
Section titled “When does Phase B land?”When stack maps, scheduler coordination, and conformance suites prove safe parallel mutators. Until then GC-003 remains in force.
Troubleshooting
Section titled “Troubleshooting”| Symptom | Check |
|---|---|
| Random segfaults after field assign | Barrier missing in lowering for reference store |
| Heap never shrinks | Pacing not triggered; call gc_collect in test to validate sweep |
| Leak across FFI | Unmatched gc_register_root / gc_unregister_root |
| Fibers see stale objects | Violated single-mutator rule—audit scheduler attachment |
Related topics
Section titled “Related topics”- Fiber scheduler FAQ (if present) or hub
- Flow and algorithm