blob: dc6d74bad6849b78ea4be50482932fb3378a11e8 [file] [log] [blame]
Russ Cox33e396a2010-02-03 16:31:34 -08001// $G $D/$F.go && $L $F.$A && ./$A.out
2
3// Copyright 2009 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// trivial finalizer test
8
9package main
10
Russ Cox4e28cfe2010-03-26 14:15:30 -070011import (
12 "runtime"
13 "time"
14)
Russ Cox33e396a2010-02-03 16:31:34 -080015
16const N = 250
17
18type A struct {
19 b *B
20 n int
21}
22
23type B struct {
24 n int
25}
26
27var i int
28var nfinal int
29var final [N]int
30
Russ Cox4e28cfe2010-03-26 14:15:30 -070031// the unused return is to test finalizers with return values
32func finalA(a *A) (unused [N]int) {
Russ Cox33e396a2010-02-03 16:31:34 -080033 if final[a.n] != 0 {
Rob Pike325cf8e2010-03-24 16:46:53 -070034 println("finalA", a.n, final[a.n])
35 panic("fail")
Russ Cox33e396a2010-02-03 16:31:34 -080036 }
37 final[a.n] = 1
Russ Cox4e28cfe2010-03-26 14:15:30 -070038 return
Russ Cox33e396a2010-02-03 16:31:34 -080039}
40
41func finalB(b *B) {
42 if final[b.n] != 1 {
Rob Pike325cf8e2010-03-24 16:46:53 -070043 println("finalB", b.n, final[b.n])
44 panic("fail")
Russ Cox33e396a2010-02-03 16:31:34 -080045 }
46 final[b.n] = 2
47 nfinal++
48}
49
50func main() {
51 runtime.GOMAXPROCS(4)
52 for i = 0; i < N; i++ {
53 b := &B{i}
54 a := &A{b, i}
55 runtime.SetFinalizer(b, finalB)
56 runtime.SetFinalizer(a, finalA)
57 }
58 for i := 0; i < N; i++ {
59 runtime.GC()
60 runtime.Gosched()
Russ Cox00f9f0c2010-03-30 10:34:57 -070061 time.Sleep(1e6)
Russ Cox33e396a2010-02-03 16:31:34 -080062 }
Russ Coxa00917c2010-03-24 19:52:07 -070063 if nfinal < N*8/10 {
Russ Cox00f9f0c2010-03-30 10:34:57 -070064 println("not enough finalizing:", nfinal, "/", N)
65 panic("fail")
Russ Cox33e396a2010-02-03 16:31:34 -080066 }
67}