make_browsers creates each browser synchronously and adopts it in the same call, so no view waits on a browser: it leaves before creation (skipped) or has a browser to close. The late-close branch in on_after_created is gone. webprobe drops 5 views before the pump and 10 within 27 ms; webview.sh wants all 35 freed before the hold. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
999 B
FAIL
crates/ely-web-content/examples/webprobe.rs:193 — The early-close regression does not ensure a drop before make_browsers. On Windows and WSL, the retained churn frees 30/30 surfaces, but every drop already has a browser; no closed surface is skipped. Removing only the pre-creation surface.closed guard, while retaining synchronous creation and adoption, still passes this probe with 30/30 released. Yet opening and dropping ten views in one GPUI update before the pump runs frees only 20/30 with that mutant, versus 30/30 with current code: the deferred close runs before creation, and the ten subsequently created browsers leak. This is a reachable ordering in the current design, unlike R2's removed asynchronous ordering. Add a deterministic pre-pump open/drop case and verify its release assertion rejects removal of the closed guard. Evidence: .work/m12-r3/{windows,linux}-no-skip-{retained,pre}-result.log; method, current-code results and cleanup: .work/m12-r3/evidence.log.