| // run | 
 |  | 
 | // Copyright 2016 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. | 
 | package main | 
 |  | 
 | import "runtime" | 
 |  | 
 | func main() { | 
 | 	{ | 
 | 		x := inuse() | 
 | 		c := make(chan []byte, 10) | 
 | 		c <- make([]byte, 10<<20) | 
 | 		close(c) | 
 | 		f1(c, x) | 
 | 	} | 
 | 	{ | 
 | 		x := inuse() | 
 | 		c := make(chan []byte, 10) | 
 | 		c <- make([]byte, 10<<20) | 
 | 		close(c) | 
 | 		f2(c, x) | 
 | 	} | 
 | } | 
 |  | 
 | func f1(c chan []byte, start int64) { | 
 | 	for x := range c { | 
 | 		if delta := inuse() - start; delta < 9<<20 { | 
 | 			println("BUG: f1: after alloc: expected delta at least 9MB, got: ", delta) | 
 | 			println(x) | 
 | 		} | 
 | 		x = nil | 
 | 		if delta := inuse() - start; delta > 1<<20 { | 
 | 			println("BUG: f1: after alloc: expected delta below 1MB, got: ", delta) | 
 | 			println(x) | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | func f2(c chan []byte, start int64) { | 
 | 	for { | 
 | 		x, ok := <-c | 
 | 		if !ok { | 
 | 			break | 
 | 		} | 
 | 		if delta := inuse() - start; delta < 9<<20 { | 
 | 			println("BUG: f2: after alloc: expected delta at least 9MB, got: ", delta) | 
 | 			println(x) | 
 | 		} | 
 | 		x = nil | 
 | 		if delta := inuse() - start; delta > 1<<20 { | 
 | 			println("BUG: f2: after alloc: expected delta below 1MB, got: ", delta) | 
 | 			println(x) | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | func inuse() int64 { | 
 | 	runtime.GC() | 
 | 	var st runtime.MemStats | 
 | 	runtime.ReadMemStats(&st) | 
 | 	return int64(st.Alloc) | 
 | } |