|  | // 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) | 
|  | } |