| 
									
										
										
										
											2012-02-16 23:50:37 -05:00
										 |  |  | // run | 
					
						
							| 
									
										
										
										
											2011-10-13 15:54:23 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-10 14:32:26 -07:00
										 |  |  | // Copyright 2011 The Go Authors. All rights reserved. | 
					
						
							| 
									
										
										
										
											2011-10-13 15:54:23 -04:00
										 |  |  | // Use of this source code is governed by a BSD-style | 
					
						
							|  |  |  | // license that can be found in the LICENSE file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Test that goroutines and garbage collection run during init. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import "runtime" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var x []byte | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func init() { | 
					
						
							|  |  |  | 	c := make(chan int) | 
					
						
							|  |  |  | 	go send(c) | 
					
						
							|  |  |  | 	<-c | 
					
						
							| 
									
										
										
										
											2012-02-06 19:16:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-13 08:06:36 -08:00
										 |  |  | 	const N = 1000 | 
					
						
							|  |  |  | 	const MB = 1 << 20 | 
					
						
							|  |  |  | 	b := make([]byte, MB) | 
					
						
							| 
									
										
										
										
											2011-10-13 15:54:23 -04:00
										 |  |  | 	for i := range b { | 
					
						
							|  |  |  | 		b[i] = byte(i%10 + '0') | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	s := string(b) | 
					
						
							| 
									
										
										
										
											2015-02-13 08:06:36 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	memstats := new(runtime.MemStats) | 
					
						
							|  |  |  | 	runtime.ReadMemStats(memstats) | 
					
						
							|  |  |  | 	sys, numGC := memstats.Sys, memstats.NumGC | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Generate 1,000 MB of garbage, only retaining 1 MB total. | 
					
						
							|  |  |  | 	for i := 0; i < N; i++ { | 
					
						
							| 
									
										
										
										
											2011-10-13 15:54:23 -04:00
										 |  |  | 		x = []byte(s) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-02-13 08:06:36 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Verify that the garbage collector ran by seeing if we | 
					
						
							|  |  |  | 	// allocated fewer than N*MB bytes from the system. | 
					
						
							| 
									
										
										
										
											2012-02-06 19:16:26 +01:00
										 |  |  | 	runtime.ReadMemStats(memstats) | 
					
						
							| 
									
										
										
										
											2015-02-13 08:06:36 -08:00
										 |  |  | 	sys1, numGC1 := memstats.Sys, memstats.NumGC | 
					
						
							|  |  |  | 	if sys1-sys >= N*MB || numGC1 == numGC { | 
					
						
							|  |  |  | 		println("allocated 1000 chunks of", MB, "and used ", sys1-sys, "memory") | 
					
						
							| 
									
										
										
										
											2016-04-14 14:07:59 -04:00
										 |  |  | 		println("numGC went", numGC, "to", numGC1) | 
					
						
							| 
									
										
										
										
											2013-02-12 13:17:49 -05:00
										 |  |  | 		panic("init1") | 
					
						
							| 
									
										
										
										
											2011-10-13 15:54:23 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func send(c chan int) { | 
					
						
							|  |  |  | 	c <- 1 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func main() { | 
					
						
							|  |  |  | } |