Skip to content

Commit 76b5937

Browse files
docs(r22): record ch53 plan outcome (measured HALO matrix, frame sizes, deltas)
1 parent 566a772 commit 76b5937

1 file changed

Lines changed: 43 additions & 0 deletions

File tree

‎_plans/r22-ch53-plan.md‎

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,46 @@ S6 `_docs/53-coroutines.md` · S7 2 diagrams + catalogue · S8 gate matrix · S9
120120
`verify.lua` PASS/FAIL 0 with C and F running for real; runner 1 passed; `validate.py` OK;
121121
every chapter code block verbatim; footer states GCC 16.1.1 / clang 22.1.8, the frame
122122
sizes, and the HALO split as measured.
123+
124+
## Outcome (2026-08-19)
125+
126+
All steps complete. `verify.lua` → **PASS 32 / FAIL 0** with gate F (clang parity + the
127+
HALO contrast) running for real. Runner → 1 passed. `validate.py` → OK. Banned-words
128+
clean after one fix. **22/22 chapter code blocks verbatim.**
129+
130+
### The overlap check worked
131+
132+
Checking ch27 *before* planning (rather than mid-draft, as happened in r20) is what
133+
produced this chapter's angle. ch27 owns the mechanism; ch53 owns the cost. No epoll, no
134+
reactor, no awaitable-protocol tutorial anywhere in ch53, and the opening cites ch27
135+
explicitly.
136+
137+
### Deltas
138+
139+
- **`lifetime` had to be re-instrumented.** The first version counted `operator new` and
140+
reported `leaked_frames=1 owned_frames=1` — identical numbers that demonstrated
141+
nothing, since both halves allocate one frame. Switched to counting `operator delete`,
142+
which runs only on `destroy()`: now `abandoned alloc=1 free=0` vs
143+
`owned alloc=1 free=1`. The chapter states why that is the right counter.
144+
- **Two promise types, deliberately.** `Counted` uses `suspend_always` at initial suspend
145+
so the frame provably outlives the call and nothing is elidable — that is what `frames`
146+
needs. `Eager` uses `suspend_never` at both ends so elision is *permitted* — that is
147+
what `halo` needs. A `halo` case built on `Counted` would have reported 1000
148+
allocations under both compilers and supported the wrong conclusion entirely.
149+
- **One banned word** ("two honest qualifications") caught by the check and removed.
150+
151+
### Measured, and worth keeping
152+
153+
Frame sizes: trivial **32**, four ints + `char[256]` **304**, `char[4096]` **4128**.
154+
Against ch50's measured 8388608-byte thread stack: **262144x**, computed in the program.
155+
156+
HALO across the shipped source, 1000 calls:
157+
158+
| compiler | -O0 | -O1 | -O2 | -O3 |
159+
| --- | --- | --- | --- | --- |
160+
| g++ 16.1.1 | 1000 | 1000 | 1000 | 1000 |
161+
| clang++ 22.1.8 | 1000 | **0** | **0** | — |
162+
163+
Gate C asserts only internal consistency, never that elision does or does not happen — a
164+
future GCC that starts eliding must not fail a test for improving. Gate F asserts the
165+
relationship (clang <= GCC), which stays true whichever way either compiler moves.

0 commit comments

Comments
 (0)