| // run |
| |
| // Copyright 2010 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 selects do not consume undue memory. |
| |
| package main |
| |
| import "runtime" |
| |
| func sender(c chan int, n int) { |
| for i := 0; i < n; i++ { |
| c <- 1 |
| } |
| } |
| |
| func receiver(c, dummy chan int, n int) { |
| for i := 0; i < n; i++ { |
| select { |
| case <-c: |
| // nothing |
| case <-dummy: |
| panic("dummy") |
| } |
| } |
| } |
| |
| func main() { |
| runtime.MemProfileRate = 0 |
| |
| c := make(chan int) |
| dummy := make(chan int) |
| |
| // warm up |
| go sender(c, 100000) |
| receiver(c, dummy, 100000) |
| runtime.GC() |
| memstats := new(runtime.MemStats) |
| runtime.ReadMemStats(memstats) |
| alloc := memstats.Alloc |
| |
| // second time shouldn't increase footprint by much |
| go sender(c, 100000) |
| receiver(c, dummy, 100000) |
| runtime.GC() |
| runtime.ReadMemStats(memstats) |
| |
| // Be careful to avoid wraparound. |
| if memstats.Alloc > alloc && memstats.Alloc-alloc > 1.1e5 { |
| println("BUG: too much memory for 100,000 selects:", memstats.Alloc-alloc) |
| } |
| } |