Home | History | Annotate | Download | only in src
      1 // Copyright 2015 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package main
      6 
      7 // The memory profiler can call copy from a slice on the system stack,
      8 // which msan used to think meant a reference to uninitialized memory.
      9 
     10 /*
     11 #include <time.h>
     12 #include <unistd.h>
     13 
     14 extern void Nop(char*);
     15 
     16 // Use weak as a hack to permit defining a function even though we use export.
     17 void poison() __attribute__ ((weak));
     18 
     19 // Poison the stack.
     20 void poison() {
     21 	char a[1024];
     22 	Nop(&a[0]);
     23 }
     24 
     25 */
     26 import "C"
     27 
     28 import (
     29 	"runtime"
     30 )
     31 
     32 func main() {
     33 	runtime.MemProfileRate = 1
     34 	start(100)
     35 }
     36 
     37 func start(i int) {
     38 	if i == 0 {
     39 		return
     40 	}
     41 	C.poison()
     42 	// Tie up a thread.
     43 	// We won't actually wait for this sleep to complete.
     44 	go func() { C.sleep(1) }()
     45 	start(i - 1)
     46 }
     47 
     48 //export Nop
     49 func Nop(*C.char) {
     50 }
     51