Record the refcount removal beside the sweep that raised it

This commit is contained in:
iris-ai committed 2026-09-21 00:16:55 -04:00
1 parent d24ff83d6b
commit 6450615434
2 files changed
+45 -26

No files matched your search

+21 -17
View File
@@ -6,10 +6,10 @@ found is in `docs/LAYOUT_LOG.md`.
## A sweep for allocation, and the cost per child, is on #19
The fourteenth sweep landed at `97fca76`. It read the whole branch again,
aimed first at what allocates and then at whatever the reading turned up.
Eight findings, the largest two both about cost per thing rather than per
frame:
The fourteenth sweep landed at `97fca76`, with the refcount removal below at
`429a4f1`. It read the whole branch again, aimed first at what allocates and
then at whatever the reading turned up. Nine findings, the largest two both
about cost per thing rather than per frame:
- **A container's draw was quadratic in its children.** Five per-child steps
each asked "have I done this one already?" by searching a list; at 1,600
@@ -38,14 +38,21 @@ changed; and two comments this branch's own commits falsified -- one saying
`widget_trait!` takes no attributes after `76aaf06` taught it to, one saying
`Scroll` clips when masking is a capability a caller opts into with `Masked`.
The ninth is the one Bryan asked for on 2026-09-21, having first been left for
the pre-gate pass: `StrongWidget` allocated a `RefCounter(Arc<AtomicU32>)` it
could never use, since it deliberately has no `Clone`, so every widget paid a
heap allocation and two atomic read-modify-writes for a count that stayed at
zero. It is the id, the sender and the type now, and `Drop` sends;
`size_of::<StrongWidget>()` is 32 rather than 40. `RefCounter` stays for
`TextureHandle`, which does clone, trimmed to what that needs.
It also left five things, with the numbers. Text allocates about six times per
re-broken paragraph per frame, and removing all of them is **0.07%** of
instructions (3.7107B to 3.7081B over 500 sweeping resize frames of 40
paragraphs), so the count is recorded rather than the machinery built --
allocation count and cost are not the same quantity, and this is where they
part. `StrongWidget` carries an `Arc<AtomicU32>` it can never use, since it has
no `Clone`; that and seven dead items older than #19 are listed under the
pre-gate review below rather than fixed here.
part. Seven dead items older than #19 are listed under the pre-gate review
below rather than fixed here.
`docs/LAYOUT_LOG.md` has all of it. Verified: format, clippy both ways, 190
ordinary, 193 diagnostic and 189 release tests, the cold dump byte-identical to
@@ -287,9 +294,10 @@ comparison work above, its review rounds past `cadfba0` are described in
- **A full sweep of the branch**, `cbccfb6` -- a length of zero that printed
as nothing, a ceiling that stepped off the top of the grid, and a harness
setter that dropped the bound beside the length it set.
- **A sweep for allocation and the cost per child**, `97fca76` -- a
container's draw quadratic in its children, and a mask's rectangle resolved
once per fragment. Described at the top of this file.
- **A sweep for allocation and the cost per child**, `97fca76` and `429a4f1`
-- a container's draw quadratic in its children, a mask's rectangle resolved
once per fragment, and the refcount a widget handle can never raise.
Described at the top of this file.
The settled design of the vocabulary rounds is in `docs/LAYOUT.md` under
"Three names, and the one argument that says them". Bryan settled the API
@@ -401,13 +409,9 @@ a compile error, which reads exactly like a fuzzer failure.
grammars of which `core/src/util/vec2.rs` uses two, one line apart.
`Align` now has `Index<Axis>`, so the `if let Some` each
`partial_align` writes twice collapses when that sweep reaches them.
The fourteenth sweep adds more: `StrongWidget` allocates an
`Arc<AtomicU32>` refcount it can never use, because it deliberately has no
`Clone`, so every widget pays a heap allocation and two atomic
read-modify-writes for a count that stays at zero, and `StrongWidget::refs`
has no caller; and `Size::to_uivec2`, `Size::rel`, `Size::leftover`,
`Len::to_uivec2`, `Vec2::with_x`, `Vec2::with_y`, `Vec2::ceil` and
`Layers::iter_orderless_mut` are all dead.
The fourteenth sweep adds more, all dead: `Size::to_uivec2`, `Size::rel`,
`Size::leftover`, `Len::to_uivec2`, `Vec2::with_x`, `Vec2::with_y`,
`Vec2::ceil` and `Layers::iter_orderless_mut`.
3. **Integrate the app's Iris capabilities before changing its pin.**
`32f6ad8` has 45 commits not reachable from the review branch; shared UI
ownership, richer masks, Android support, and app-side performance work