1// Copyright 2016 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
5package main
6
7// Test that SIGPROF received in C code does not crash the process
8// looking for the C code's func pointer.
9
10// This is a regression test for issue 14599, where profiling fails when the
11// function is the first C function. Exported functions are the first C
12// functions, so we use an exported function. Exported functions are created in
13// lexicographical order of source files, so this file is named aprof.go to
14// ensure its function is first.
15
16// extern void CallGoNop();
17import "C"
18
19import (
20	"bytes"
21	"fmt"
22	"runtime/pprof"
23	"time"
24)
25
26func init() {
27	register("CgoCCodeSIGPROF", CgoCCodeSIGPROF)
28}
29
30//export GoNop
31func GoNop() {}
32
33func CgoCCodeSIGPROF() {
34	c := make(chan bool)
35	go func() {
36		<-c
37		start := time.Now()
38		for i := 0; i < 1e7; i++ {
39			if i%1000 == 0 {
40				if time.Since(start) > time.Second {
41					break
42				}
43			}
44			C.CallGoNop()
45		}
46		c <- true
47	}()
48
49	var buf bytes.Buffer
50	pprof.StartCPUProfile(&buf)
51	c <- true
52	<-c
53	pprof.StopCPUProfile()
54
55	fmt.Println("OK")
56}
57