...
Run Format

Source file test/chan/select2.go

Documentation: test/chan

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

View as plain text