diff options
author | Hector Martin Cantero <hector@marcansoft.com> | 2014-09-24 13:20:25 -0400 |
---|---|---|
committer | Hector Martin Cantero <hector@marcansoft.com> | 2014-09-24 13:20:25 -0400 |
commit | fc939958db89c3cb14b87d3944a09c541951644b (patch) | |
tree | d42b571a540833bd9b0e84c223adf411f97b5935 /src/run.bash | |
parent | ef69714063fe22d25ff726cd16864743407fac32 (diff) | |
download | go-fc939958db89c3cb14b87d3944a09c541951644b.tar.gz |
runtime: keep g->syscallsp consistent after cgo->Go callbacks
Normally, the caller to runtime.entersyscall() must not return before
calling runtime.exitsyscall(), lest g->syscallsp become a dangling
pointer. runtime.cgocallbackg() violates this constraint. To work around
this, save g->syscallsp and g->syscallpc around cgo->Go callbacks, then
restore them after calling runtime.entersyscall(), which restores the
syscall stack frame pointer saved by cgocall. This allows the GC to
correctly trace a goroutine that is currently returning from a
Go->cgo->Go chain.
This also adds a check to proc.c that panics if g->syscallsp is clearly
invalid. It is not 100% foolproof, as it will not catch a case where the
stack was popped then pushed back beyond g->syscallsp, but it does catch
the present cgo issue and makes existing tests fail without the bugfix.
Fixes issue 7978.
LGTM=dvyukov, rsc
R=golang-codereviews, dvyukov, minux, bradfitz, iant, gobot, rsc
CC=golang-codereviews, rsc
https://codereview.appspot.com/131910043
Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/run.bash')
-rwxr-xr-x | src/run.bash | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/run.bash b/src/run.bash index b5f061d88..d6e53304d 100755 --- a/src/run.bash +++ b/src/run.bash @@ -119,6 +119,8 @@ go run $GOROOT/test/run.go - . || exit 1 [ "$CGO_ENABLED" != 1 ] || (xcd ../misc/cgo/test +# cgo tests inspect the traceback for runtime functions +export GOTRACEBACK=2 go test -ldflags '-linkmode=auto' || exit 1 # linkmode=internal fails on dragonfly since errno is a TLS relocation. [ "$GOHOSTOS" == dragonfly ] || go test -ldflags '-linkmode=internal' || exit 1 |