modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/gc2.go (about)

     1  // +build !nacl
     2  // run
     3  
     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  
    13  package main
    14  
    15  import (
    16  	"fmt"
    17  	"os"
    18  	"runtime"
    19  )
    20  
    21  func 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  }