diff options
author | Russ Cox <rsc@golang.org> | 2010-02-03 16:31:34 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-02-03 16:31:34 -0800 |
commit | 33e396a4a725a2da9cc9ef1f6a0734f0c1381b8d (patch) | |
tree | 7c63784eb4007f5d7a118b7133d7a611efa2704d /test/mallocfin.go | |
parent | 00f4c6a1b5bc9ed76529d596ac28ecdaf890fb52 (diff) | |
download | go-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.go | 58 |
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) + } +} |