1// run
2
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
7// Test that buffered channels are garbage collected properly.
8// 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
22	st := new(runtime.MemStats)
23	memstats := new(runtime.MemStats)
24	runtime.ReadMemStats(st)
25	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	}
37
38	runtime.ReadMemStats(memstats)
39	obj := memstats.HeapObjects - st.HeapObjects
40	if obj > N/5 {
41		fmt.Println("too many objects left:", obj)
42		os.Exit(1)
43	}
44}
45