mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 08:40:55 +00:00 
			
		
		
		
	 9d93d57465
			
		
	
	
		9d93d57465
		
	
	
	
	
		
			
			The gccgo library generates some garbage in the init routines because it handles interfaces slightly differently. Since the test sets MemStats.Alloc to 0, the first time the garbage collector runs it goes negative and the test fails. R=rsc, r2 CC=golang-dev https://golang.org/cl/2110044
		
			
				
	
	
		
			66 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // $G $D/$F.go && $L $F.$A && ./$A.out
 | |
| 
 | |
| // Copyright 2009 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.
 | |
| 
 | |
| // Repeated malloc test.
 | |
| 
 | |
| package main
 | |
| 
 | |
| import (
 | |
| 	"flag"
 | |
| 	"runtime"
 | |
| )
 | |
| 
 | |
| var chatty = flag.Bool("v", false, "chatty")
 | |
| 
 | |
| var oldsys uint64
 | |
| 
 | |
| func bigger() {
 | |
| 	if st := runtime.MemStats; oldsys < st.Sys {
 | |
| 		oldsys = st.Sys
 | |
| 		if *chatty {
 | |
| 			println(st.Sys, " system bytes for ", st.Alloc, " Go bytes")
 | |
| 		}
 | |
| 		if st.Sys > 1e9 {
 | |
| 			println("too big")
 | |
| 			panic("fail")
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func main() {
 | |
| 	runtime.GC()		   // clean up garbage from init
 | |
| 	runtime.MemProfileRate = 0 // disable profiler
 | |
| 	runtime.MemStats.Alloc = 0 // ignore stacks
 | |
| 	flag.Parse()
 | |
| 	for i := 0; i < 1<<7; i++ {
 | |
| 		for j := 1; j <= 1<<22; j <<= 1 {
 | |
| 			if i == 0 && *chatty {
 | |
| 				println("First alloc:", j)
 | |
| 			}
 | |
| 			if a := runtime.MemStats.Alloc; a != 0 {
 | |
| 				println("no allocations but stats report", a, "bytes allocated")
 | |
| 				panic("fail")
 | |
| 			}
 | |
| 			b := runtime.Alloc(uintptr(j))
 | |
| 			during := runtime.MemStats.Alloc
 | |
| 			runtime.Free(b)
 | |
| 			if a := runtime.MemStats.Alloc; a != 0 {
 | |
| 				println("allocated ", j, ": wrong stats: during=", during, " after=", a, " (want 0)")
 | |
| 				panic("fail")
 | |
| 			}
 | |
| 			bigger()
 | |
| 		}
 | |
| 		if i%(1<<10) == 0 && *chatty {
 | |
| 			println(i)
 | |
| 		}
 | |
| 		if i == 0 {
 | |
| 			if *chatty {
 | |
| 				println("Primed", i)
 | |
| 			}
 | |
| 			//	runtime.frozen = true
 | |
| 		}
 | |
| 	}
 | |
| }
 |