runtime: run syscall/js finalizers on wasm without a manual GC (#5545)

* runtime: run syscall/js finalizers on wasm without a manual GC

* runtime: address review feedback on finalizer idle GC

* runtime: clear a finished task's args pointer so its arguments are collectable

* runtime: skip the finalizer scan with a per-block registration bit

* runtime: guard the finalizer registration bitmap with gcLock

* testdata: cover finalizer invariants on every scheduler

* main_test: limit the finalizer scheduler variants to linux and darwin

* testdata: wait for the finalizer queue to drain before asserting

* testdata: make the finalizer counters atomic and wait for a known drain count

* runtime: add finalizer bookkeeping asserts under runtime_asserts

* runtime: address finalizer GC review feedback

* testdata: strengthen blocked stack finalizer test

* runtime: fix finalizer cleanup edge cases

* runtime: decouple wasm export scheduling from finalizers

* runtime: avoid redundant wakeups for re-entrant wasm exports

* runtime: simplify finalizer comments
This commit is contained in:
Felipe Gené
2026-08-26 15:03:44 -03:00
committed by GitHub
parent 8d6240a5e6
commit 31fff2c9a3
22 changed files with 1048 additions and 56 deletions
+29
View File
@@ -0,0 +1,29 @@
package main
import "runtime"
type largeFinalizerObject struct {
data [128]byte
}
var largeFinalizerRan bool
//go:noinline
func registerLargeFinalizer() {
p := new(largeFinalizerObject)
runtime.SetFinalizer(p, func(*largeFinalizerObject) {
largeFinalizerRan = true
})
}
func main() {
registerLargeFinalizer()
for i := 0; i < 100 && !largeFinalizerRan; i++ {
runtime.GC()
runtime.Gosched()
}
if !largeFinalizerRan {
panic("large object finalizer did not run")
}
println("ok")
}