| // Copyright 2016 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. | |
| package main | |
| // Test that SIGPROF received in C code does not crash the process | |
| // looking for the C code's func pointer. | |
| // The test fails when the function is the first C function. | |
| // The exported functions are the first C functions, so we use that. | |
| // extern void GoNop(); | |
| import "C" | |
| import ( | |
| "bytes" | |
| "fmt" | |
| "runtime/pprof" | |
| "time" | |
| ) | |
| func init() { | |
| register("CgoCCodeSIGPROF", CgoCCodeSIGPROF) | |
| } | |
| //export GoNop | |
| func GoNop() {} | |
| func CgoCCodeSIGPROF() { | |
| c := make(chan bool) | |
| go func() { | |
| <-c | |
| start := time.Now() | |
| for i := 0; i < 1e7; i++ { | |
| if i%1000 == 0 { | |
| if time.Since(start) > time.Second { | |
| break | |
| } | |
| } | |
| C.GoNop() | |
| } | |
| c <- true | |
| }() | |
| var buf bytes.Buffer | |
| pprof.StartCPUProfile(&buf) | |
| c <- true | |
| <-c | |
| pprof.StopCPUProfile() | |
| fmt.Println("OK") | |
| } |