1// run
2
3// Copyright 2016 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
7package main
8
9import "runtime"
10
11func main() {
12	{
13		x := inuse()
14		c := make(chan []byte, 10)
15		c <- make([]byte, 10<<20)
16		close(c)
17		f1(c, x)
18	}
19	{
20		x := inuse()
21		c := make(chan []byte, 10)
22		c <- make([]byte, 10<<20)
23		close(c)
24		f2(c, x)
25	}
26}
27
28func f1(c chan []byte, start int64) {
29	for x := range c {
30		if delta := inuse() - start; delta < 9<<20 {
31			println("BUG: f1: after alloc: expected delta at least 9MB, got: ", delta)
32			println(x)
33		}
34		x = nil
35		if delta := inuse() - start; delta > 1<<20 {
36			println("BUG: f1: after alloc: expected delta below 1MB, got: ", delta)
37			println(x)
38		}
39	}
40}
41
42func f2(c chan []byte, start int64) {
43	for {
44		x, ok := <-c
45		if !ok {
46			break
47		}
48		if delta := inuse() - start; delta < 9<<20 {
49			println("BUG: f2: after alloc: expected delta at least 9MB, got: ", delta)
50			println(x)
51		}
52		x = nil
53		if delta := inuse() - start; delta > 1<<20 {
54			println("BUG: f2: after alloc: expected delta below 1MB, got: ", delta)
55			println(x)
56		}
57	}
58}
59
60func inuse() int64 {
61	runtime.GC()
62	var st runtime.MemStats
63	runtime.ReadMemStats(&st)
64	return int64(st.Alloc)
65}
66