aboutsummaryrefslogtreecommitdiff
path: root/test/mallocfin.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-02-03 16:31:34 -0800
committerRuss Cox <rsc@golang.org>2010-02-03 16:31:34 -0800
commit33e396a4a725a2da9cc9ef1f6a0734f0c1381b8d (patch)
tree7c63784eb4007f5d7a118b7133d7a611efa2704d /test/mallocfin.go
parent00f4c6a1b5bc9ed76529d596ac28ecdaf890fb52 (diff)
downloadgo-33e396a4a725a2da9cc9ef1f6a0734f0c1381b8d.tar.gz
go-33e396a4a725a2da9cc9ef1f6a0734f0c1381b8d.zip
finalizers; merge package malloc into package runtime
R=r, cw CC=golang-dev https://golang.org/cl/198085
Diffstat (limited to 'test/mallocfin.go')
-rw-r--r--test/mallocfin.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/test/mallocfin.go b/test/mallocfin.go
new file mode 100644
index 0000000000..4c832583e0
--- /dev/null
+++ b/test/mallocfin.go
@@ -0,0 +1,58 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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
+
+package main
+
+import "runtime"
+
+const N = 250
+
+type A struct {
+ b *B
+ n int
+}
+
+type B struct {
+ n int
+}
+
+var i int
+var nfinal int
+var final [N]int
+
+func finalA(a *A) {
+ if final[a.n] != 0 {
+ panicln("finalA", a.n, final[a.n])
+ }
+ final[a.n] = 1
+}
+
+func finalB(b *B) {
+ if final[b.n] != 1 {
+ panicln("finalB", b.n, final[b.n])
+ }
+ final[b.n] = 2
+ nfinal++
+}
+
+func main() {
+ runtime.GOMAXPROCS(4)
+ for i = 0; i < N; i++ {
+ b := &B{i}
+ a := &A{b, i}
+ runtime.SetFinalizer(b, finalB)
+ runtime.SetFinalizer(a, finalA)
+ }
+ for i := 0; i < N; i++ {
+ runtime.GC()
+ runtime.Gosched()
+ }
+ if nfinal < N*9/10 {
+ panic("not enough finalizing:", nfinal, "/", N)
+ }
+}