runtime: run all finalizers in a single goroutine.
eliminate second pass of mark+sweep
by scanning finalizer table specially.
R=r
CC=golang-dev
https://golang.org/cl/782041
diff --git a/test/mallocfin.go b/test/mallocfin.go
index da3253a..44229d4 100644
--- a/test/mallocfin.go
+++ b/test/mallocfin.go
@@ -8,7 +8,10 @@
package main
-import "runtime"
+import (
+ "runtime"
+ "time"
+)
const N = 250
@@ -25,12 +28,14 @@
var nfinal int
var final [N]int
-func finalA(a *A) {
+// the unused return is to test finalizers with return values
+func finalA(a *A) (unused [N]int) {
if final[a.n] != 0 {
println("finalA", a.n, final[a.n])
panic("fail")
}
final[a.n] = 1
+ return
}
func finalB(b *B) {
@@ -53,6 +58,7 @@
for i := 0; i < N; i++ {
runtime.GC()
runtime.Gosched()
+ time.Sleep(1e6);
}
if nfinal < N*8/10 {
panic("not enough finalizing:", nfinal, "/", N)