diff --git a/src/runtime/crash_cgo_test.go b/src/runtime/crash_cgo_test.go index 5e5871229729ef..f44032156117b9 100644 --- a/src/runtime/crash_cgo_test.go +++ b/src/runtime/crash_cgo_test.go @@ -710,3 +710,15 @@ func TestCgoTracebackGoroutineProfile(t *testing.T) { t.Fatalf("want %s, got %s\n", want, output) } } + +func TestCgoTraceParser(t *testing.T) { + switch runtime.GOOS { + case "windows", "plan9": + t.Skipf("skipping cgo trace parser test on %s", runtime.GOOS) + } + output := runTestProg(t, "testprogcgo", "CgoTraceParser") + want := "OK\n" + if output != want { + t.Fatalf("want %s, got %s\n", want, output) + } +} diff --git a/src/runtime/testdata/testprogcgo/cgotrace.go b/src/runtime/testdata/testprogcgo/cgotrace.go new file mode 100644 index 00000000000000..685ff565a36305 --- /dev/null +++ b/src/runtime/testdata/testprogcgo/cgotrace.go @@ -0,0 +1,53 @@ +// Copyright 2011 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. + +// This is for issue #29707 + +package main + +/* + #include + + extern void* callbackTraceParser(void*); + typedef void* (*cbTraceParser)(void*); + + static void testCallbackTraceParser(cbTraceParser cb) { + cb(NULL); + } +*/ +import "C" + +import ( + "bytes" + "fmt" + traceparser "internal/trace" + "runtime/trace" + "time" + "unsafe" +) + +func init() { + register("CgoTraceParser", CgoTraceParser) +} + +//export callbackTraceParser +func callbackTraceParser(unsafe.Pointer) unsafe.Pointer { + time.Sleep(time.Millisecond) + return nil +} + +func CgoTraceParser() { + buf := new(bytes.Buffer) + + trace.Start(buf) + C.testCallbackTraceParser(C.cbTraceParser(C.callbackTraceParser)) + trace.Stop() + + _, err := traceparser.Parse(buf, "") + if err != nil { + fmt.Println("Parse error: ", err) + } else { + fmt.Println("OK") + } +}