// 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. // Tests CPU profiling. //go:build ignore package main /* #include void go_callback(); void go_callback2(); static void *thr(void *arg) { go_callback(); return 0; } static void foo() { pthread_t th; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, 256 << 10); pthread_create(&th, &attr, thr, 0); pthread_join(th, 0); } static void bar() { go_callback2(); } */ import "C" import ( "log" "os" "runtime" "runtime/trace" ) //export go_callback func go_callback() { // Do another call into C, just to test that path too. C.bar() } //export go_callback2 func go_callback2() { runtime.GC() } func main() { // Start tracing. if err := trace.Start(os.Stdout); err != nil { log.Fatalf("failed to start tracing: %v", err) } // Do a whole bunch of cgocallbacks. const n = 10 done := make(chan bool) for i := 0; i < n; i++ { go func() { C.foo() done <- true }() } for i := 0; i < n; i++ { <-done } // Do something to steal back any Ps from the Ms, just // for coverage. runtime.GC() // End of traced execution. trace.Stop() }