]> Cypherpunks.ru repositories - gostls13.git/blobdiff - test/mallocfin.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / mallocfin.go
index da3253a04f2c1d14421db91e3752e162da34c448..be6d79b2b8e09ed623639972ac9e9f7ff9a411bb 100644 (file)
@@ -1,14 +1,17 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
+// run
 
 // Copyright 2009 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// trivial finalizer test
+// Test basic operation of finalizers.
 
 package main
 
-import "runtime"
+import (
+       "runtime"
+       "time"
+)
 
 const N = 250
 
@@ -25,12 +28,14 @@ var i int
 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) {
@@ -42,19 +47,31 @@ func finalB(b *B) {
        nfinal++
 }
 
+func nofinalB(b *B) {
+       panic("nofinalB run")
+}
+
 func main() {
        runtime.GOMAXPROCS(4)
        for i = 0; i < N; i++ {
                b := &B{i}
                a := &A{b, i}
+               c := new(B)
+               runtime.SetFinalizer(c, nofinalB)
                runtime.SetFinalizer(b, finalB)
                runtime.SetFinalizer(a, finalA)
+               runtime.SetFinalizer(c, nil)
        }
        for i := 0; i < N; i++ {
                runtime.GC()
                runtime.Gosched()
+               time.Sleep(1e6)
+               if nfinal >= N*8/10 {
+                       break
+               }
        }
        if nfinal < N*8/10 {
-               panic("not enough finalizing:", nfinal, "/", N)
+               println("not enough finalizing:", nfinal, "/", N)
+               panic("fail")
        }
 }