// run

// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Test that goroutines and garbage collection run during init.

package main

import "runtime"

var x []byte

func init() {
	c := make(chan int)
	go send(c)
	<-c

	const N = 1000
	const MB = 1 << 20
	b := make([]byte, MB)
	for i := range b {
		b[i] = byte(i%10 + '0')
	}
	s := string(b)

	memstats := new(runtime.MemStats)
	runtime.ReadMemStats(memstats)
	sys, numGC := memstats.Sys, memstats.NumGC

	// Generate 1,000 MB of garbage, only retaining 1 MB total.
	for i := 0; i < N; i++ {
		x = []byte(s)
	}

	// Verify that the garbage collector ran by seeing if we
	// allocated fewer than N*MB bytes from the system.
	runtime.ReadMemStats(memstats)
	sys1, numGC1 := memstats.Sys, memstats.NumGC
	if sys1-sys >= N*MB || numGC1 == numGC {
		println("allocated 1000 chunks of", MB, "and used ", sys1-sys, "memory")
		println("numGC went", numGC, "to", numGC1)
		panic("init1")
	}
}

func send(c chan int) {
	c <- 1
}

func main() {
}
