Parallel GC mutators need write barriers, stack-map coverage, and scheduler coordination. Shipping partial parallel GC risks data races on the Abfall heap.
Design model
Platform spec article
Design model
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).
Purpose
Section titled “Purpose”Normative model for how Beskid heap objects live, how the Abfall tri-color collector interacts with generated code, and how Phase A scheduling constrains mutators before parallel GC (Phase B).
Primary actors
Section titled “Primary actors”| Actor | Responsibility |
|---|---|
| Compiler lowering | Emits alloc, write barriers, stack maps, type descriptors |
beskid_runtime::gc | enter_runtime_scope, heap attachment, GcSnapshot for hosts |
| Abfall heap | Concurrent mark/sweep with STW segments |
| Fiber scheduler | Ensures only one mutator runs Beskid allocations in Phase A |
Object model
Section titled “Object model”- Heap objects begin with a type descriptor pointer used for precise scanning.
alloc(size, type_desc)creates descriptor-backed payloads viaabfall::Heap::allocate_beskid.- Strings use
BeskidStr; arrays useBeskidArrayheaders (backing optional per feature flag). - Roots: stacks (stack maps), globals (registered roots), external handles (
gc_root_handle).
GC architecture
Section titled “GC architecture”flowchart TB mut[Mutator / generated code] barrier[gc_write_barrier] heap[Abfall tri-color heap] stw[STW root scan] mut -->|pointer stores| barrier --> heap heap -->|mark/sweep| stw stw --> heap
Tri-color marking runs concurrently with the mutator where Phase allows; write barriers prevent black→white edges during marking. STW episodes are limited to root scanning and phase transitions.
Phase A vs Phase B
Section titled “Phase A vs Phase B”| Phase | Mutators | Notes |
|---|---|---|
| A (current) | One Beskid mutator at a time | Fibers swap on scheduler threads; syscall pool workers must not allocate as mutators |
| B (target) | Parallel mutators with barriers | Requires full stack-map coverage and scheduler coordination |
See Fiber scheduler and stacks for parking and safepoints.
Related topics
Section titled “Related topics”- Flow and algorithm
- Legacy: Concurrent GC