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