2018-01-24 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / go.test / test / gc2.go
blobde52a4fbf2eacd4f5469972cf6d1605f75b1f119
1 // run
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.
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.)
12 package main
14 import (
15 "fmt"
16 "os"
17 "runtime"
20 func 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()
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)