X7ROOT File Manager
Current Path:
/opt/golang/1.22.0/src/runtime/testdata/testprogcgo
opt
/
golang
/
1.22.0
/
src
/
runtime
/
testdata
/
testprogcgo
/
📁
..
📄
aprof.go
(1.14 KB)
📄
aprof_c.c
(217 B)
📄
bigstack1_windows.c
(379 B)
📄
bigstack_windows.c
(1.2 KB)
📄
bigstack_windows.go
(586 B)
📄
bindm.c
(692 B)
📄
bindm.go
(1.2 KB)
📄
callback.go
(1.86 KB)
📄
catchpanic.go
(993 B)
📄
cgo.go
(1.82 KB)
📄
cgonocallback.c
(236 B)
📄
cgonocallback.go
(629 B)
📄
cgonoescape.go
(1.84 KB)
📄
crash.go
(743 B)
📄
deadlock.go
(509 B)
📄
destructor.c
(459 B)
📄
destructor.go
(442 B)
📄
dll_windows.go
(459 B)
📄
dropm.go
(1.05 KB)
📄
dropm_stub.go
(336 B)
📄
eintr.go
(5.17 KB)
📄
exec.go
(2.1 KB)
📄
gprof.go
(868 B)
📄
gprof_c.c
(700 B)
📄
issue29707.go
(1.15 KB)
📄
lockosthread.c
(301 B)
📄
lockosthread.go
(2.52 KB)
📄
main.go
(651 B)
📄
needmdeadlock.go
(1.83 KB)
📄
numgoroutine.go
(1.91 KB)
📄
panic.c
(239 B)
📄
panic.go
(312 B)
📄
pprof.go
(1.67 KB)
📄
pprof_callback.go
(1.82 KB)
📄
raceprof.go
(1.67 KB)
📄
racesig.go
(1.67 KB)
📄
segv.go
(525 B)
📄
segv_linux.go
(546 B)
📄
sigfwd.go
(1.58 KB)
📄
sigpanic.go
(484 B)
📄
sigstack.go
(2.09 KB)
📄
sigthrow.go
(312 B)
📄
stack_windows.go
(1.1 KB)
📄
stackswitch.c
(3.88 KB)
📄
stackswitch.go
(1.07 KB)
📄
threadpanic.go
(428 B)
📄
threadpanic_unix.c
(435 B)
📄
threadpanic_windows.c
(435 B)
📄
threadpprof.go
(2.54 KB)
📄
threadprof.go
(2.41 KB)
📄
trace.go
(1.15 KB)
📄
trace_unix.c
(688 B)
📄
trace_windows.c
(777 B)
📄
traceback.go
(949 B)
📄
traceback_c.c
(1.21 KB)
📄
tracebackctxt.go
(2.85 KB)
📄
tracebackctxt_c.c
(2.33 KB)
📁
windows
Editing: tracebackctxt.go
// 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 the context argument to SetCgoTraceback. // Use fake context, traceback, and symbolizer functions. /* // Defined in tracebackctxt_c.c. extern void C1(void); extern void C2(void); extern void tcContext(void*); extern void tcContextSimple(void*); extern void tcTraceback(void*); extern void tcSymbolizer(void*); extern int getContextCount(void); extern void TracebackContextPreemptionCallGo(int); */ import "C" import ( "fmt" "runtime" "sync" "unsafe" ) func init() { register("TracebackContext", TracebackContext) register("TracebackContextPreemption", TracebackContextPreemption) } var tracebackOK bool func TracebackContext() { runtime.SetCgoTraceback(0, unsafe.Pointer(C.tcTraceback), unsafe.Pointer(C.tcContext), unsafe.Pointer(C.tcSymbolizer)) C.C1() if got := C.getContextCount(); got != 0 { fmt.Printf("at end contextCount == %d, expected 0\n", got) tracebackOK = false } if tracebackOK { fmt.Println("OK") } } //export G1 func G1() { C.C2() } //export G2 func G2() { pc := make([]uintptr, 32) n := runtime.Callers(0, pc) cf := runtime.CallersFrames(pc[:n]) var frames []runtime.Frame for { frame, more := cf.Next() frames = append(frames, frame) if !more { break } } want := []struct { function string line int }{ {"main.G2", 0}, {"cFunction", 0x10200}, {"cFunction", 0x200}, {"cFunction", 0x10201}, {"cFunction", 0x201}, {"main.G1", 0}, {"cFunction", 0x10100}, {"cFunction", 0x100}, {"main.TracebackContext", 0}, } ok := true i := 0 wantLoop: for _, w := range want { for ; i < len(frames); i++ { if w.function == frames[i].Function { if w.line != 0 && w.line != frames[i].Line { fmt.Printf("found function %s at wrong line %#x (expected %#x)\n", w.function, frames[i].Line, w.line) ok = false } i++ continue wantLoop } } fmt.Printf("did not find function %s in\n", w.function) for _, f := range frames { fmt.Println(f) } ok = false break } tracebackOK = ok if got := C.getContextCount(); got != 2 { fmt.Printf("at bottom contextCount == %d, expected 2\n", got) tracebackOK = false } } // Issue 47441. func TracebackContextPreemption() { runtime.SetCgoTraceback(0, unsafe.Pointer(C.tcTraceback), unsafe.Pointer(C.tcContextSimple), unsafe.Pointer(C.tcSymbolizer)) const funcs = 10 const calls = 1e5 var wg sync.WaitGroup for i := 0; i < funcs; i++ { wg.Add(1) go func(i int) { defer wg.Done() for j := 0; j < calls; j++ { C.TracebackContextPreemptionCallGo(C.int(i*calls + j)) } }(i) } wg.Wait() fmt.Println("OK") } //export TracebackContextPreemptionGoFunction func TracebackContextPreemptionGoFunction(i C.int) { // Do some busy work. fmt.Sprintf("%d\n", i) }
Upload File
Create Folder