// Copyright 2023 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 /* // Defined in trace_*.c. void cCalledFromGo(void); */ import "C" import ( "context" "fmt" "log" "os" "runtime/trace" ) func init() { register("Trace", Trace) } // Trace is used by TestTraceUnwindCGO. func Trace() { file, err := os.CreateTemp("", "testprogcgo_trace") if err != nil { log.Fatalf("failed to create temp file: %s", err) } defer file.Close() if err := trace.Start(file); err != nil { log.Fatal(err) } defer trace.Stop() goCalledFromGo() <-goCalledFromCThreadChan fmt.Printf("trace path:%s", file.Name()) } // goCalledFromGo calls cCalledFromGo which calls back into goCalledFromC and // goCalledFromCThread. func goCalledFromGo() { C.cCalledFromGo() } //export goCalledFromC func goCalledFromC() { trace.Log(context.Background(), "goCalledFromC", "") } var goCalledFromCThreadChan = make(chan struct{}) //export goCalledFromCThread func goCalledFromCThread() { trace.Log(context.Background(), "goCalledFromCThread", "") close(goCalledFromCThreadChan) }