blob: de52a4fbf2eacd4f5469972cf6d1605f75b1f119 [file] [log] [blame]
Russ Coxd2cc9882012-02-16 23:50:37 -05001// run
Russ Cox507df952011-04-13 23:42:06 -04002
3// Copyright 2011 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
Rob Pike83976e32012-02-19 14:28:53 +11007// Test that buffered channels are garbage collected properly.
Russ Cox507df952011-04-13 23:42:06 -04008// An interesting case because they have finalizers and used to
9// have self loops that kept them from being collected.
10// (Cyclic data with finalizers is never finalized, nor collected.)
11
12package main
13
14import (
15 "fmt"
16 "os"
17 "runtime"
18)
19
20func main() {
21 const N = 10000
Rémy Oudompheng842c9062012-02-06 19:16:26 +010022 st := new(runtime.MemStats)
23 memstats := new(runtime.MemStats)
24 runtime.ReadMemStats(st)
Russ Cox507df952011-04-13 23:42:06 -040025 for i := 0; i < N; i++ {
26 c := make(chan int, 10)
27 _ = c
28 if i%100 == 0 {
29 for j := 0; j < 4; j++ {
30 runtime.GC()
31 runtime.Gosched()
32 runtime.GC()
33 runtime.Gosched()
34 }
35 }
36 }
Russ Cox226fb092011-07-22 00:55:01 -040037
Rémy Oudompheng842c9062012-02-06 19:16:26 +010038 runtime.ReadMemStats(memstats)
39 obj := memstats.HeapObjects - st.HeapObjects
Russ Cox507df952011-04-13 23:42:06 -040040 if obj > N/5 {
41 fmt.Println("too many objects left:", obj)
42 os.Exit(1)
43 }
44}