blob: b33a02780405f7787fae3d6f8a5a76e8fc096a11 [file] [log] [blame]
Brent Austinba3052e2015-04-21 16:08:23 -07001// +build !nacl
Dan Willemsen09eb3b12015-09-16 14:34:17 -07002// run
Brent Austinba3052e2015-04-21 16:08:23 -07003
4// Copyright 2011 The Go Authors. All rights reserved.
5// Use of this source code is governed by a BSD-style
6// license that can be found in the LICENSE file.
7
8// Test that buffered channels are garbage collected properly.
9// An interesting case because they have finalizers and used to
10// have self loops that kept them from being collected.
11// (Cyclic data with finalizers is never finalized, nor collected.)
12
13package main
14
15import (
16 "fmt"
17 "os"
18 "runtime"
19)
20
21func main() {
22 const N = 10000
23 st := new(runtime.MemStats)
24 memstats := new(runtime.MemStats)
25 runtime.ReadMemStats(st)
26 for i := 0; i < N; i++ {
27 c := make(chan int, 10)
28 _ = c
29 if i%100 == 0 {
30 for j := 0; j < 4; j++ {
31 runtime.GC()
32 runtime.Gosched()
33 runtime.GC()
34 runtime.Gosched()
35 }
36 }
37 }
38
39 runtime.ReadMemStats(memstats)
40 obj := int64(memstats.HeapObjects - st.HeapObjects)
41 if obj > N/5 {
42 fmt.Println("too many objects left:", obj)
43 os.Exit(1)
44 }
45}