aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/traceback.go
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2016-06-02 12:01:03 -0700
committerIan Lance Taylor <iant@golang.org>2016-06-02 19:24:55 +0000
commit03abde49713b46366fa47a037040697c8fdad3bb (patch)
tree8256b1d64c6136cc89eaaa0cd28ae63b893ec62f /src/runtime/traceback.go
parent88e0ec2979bb39bd8811ec50a69fcb5007a24623 (diff)
downloadgo-03abde49713b46366fa47a037040697c8fdad3bb.tar.xz
runtime: only permit SetCgoTraceback to be called once
Accept a duplicate call, but nothing else. Change-Id: Iec24bf5ddc3b0f0c559ad2158339aca698601743 Reviewed-on: https://go-review.googlesource.com/23692 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Dmitry Vyukov <dvyukov@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/traceback.go')
-rw-r--r--src/runtime/traceback.go10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go
index 96f154e213..80a54407b3 100644
--- a/src/runtime/traceback.go
+++ b/src/runtime/traceback.go
@@ -962,12 +962,21 @@ func isSystemGoroutine(gp *g) bool {
// traceback function will only be called with the context field set
// to zero. If the context function is nil, then calls from Go to C
// to Go will not show a traceback for the C portion of the call stack.
+//
+// SetCgoTraceback should be called only once, ideally from an init function.
func SetCgoTraceback(version int, traceback, context, symbolizer unsafe.Pointer) {
if version != 0 {
panic("unsupported version")
}
+ if cgoTraceback != nil && cgoTraceback != traceback ||
+ cgoContext != nil && cgoContext != context ||
+ cgoSymbolizer != nil && cgoSymbolizer != symbolizer {
+ panic("call SetCgoTraceback only once")
+ }
+
cgoTraceback = traceback
+ cgoContext = context
cgoSymbolizer = symbolizer
// The context function is called when a C function calls a Go
@@ -978,6 +987,7 @@ func SetCgoTraceback(version int, traceback, context, symbolizer unsafe.Pointer)
}
var cgoTraceback unsafe.Pointer
+var cgoContext unsafe.Pointer
var cgoSymbolizer unsafe.Pointer
// cgoTracebackArg is the type passed to cgoTraceback.