aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/signal_unix.go
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2019-11-25 23:29:02 -0500
committerCherry Zhang <cherryyz@google.com>2019-11-26 16:55:36 +0000
commit67f0f83216930e053441500e2b28c3fa2b667581 (patch)
tree12ce05f277c9e0428ed13627a2de511f73912ee9 /src/runtime/signal_unix.go
parent20bf6a495eabad79b7b275d46fc3e11c620b8212 (diff)
downloadgo-67f0f83216930e053441500e2b28c3fa2b667581.tar.gz
go-67f0f83216930e053441500e2b28c3fa2b667581.zip
runtime: disable async preemption on darwin/arm(64) if no cgo
On darwin, we use libc calls, and cgo is required on ARM and ARM64 so we have TLS set up to save/restore G during C calls. If cgo is absent, we cannot save/restore G in TLS, and if a signal is received during C execution we cannot get the G. Therefore don't send signals (and hope that we won't receive any signal during C execution). This can only happen in the go_bootstrap program (otherwise cgo is required). Fixes #35800. Change-Id: I6c02a9378af02c19d32749a42db45165b578188d Reviewed-on: https://go-review.googlesource.com/c/go/+/208818 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/runtime/signal_unix.go')
-rw-r--r--src/runtime/signal_unix.go10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go
index 756467f4df..3861cace08 100644
--- a/src/runtime/signal_unix.go
+++ b/src/runtime/signal_unix.go
@@ -349,6 +349,16 @@ func preemptM(mp *m) {
// yet, so doSigPreempt won't work.
return
}
+ if GOOS == "darwin" && (GOARCH == "arm" || GOARCH == "arm64") && !iscgo {
+ // On darwin, we use libc calls, and cgo is required on ARM and ARM64
+ // so we have TLS set up to save/restore G during C calls. If cgo is
+ // absent, we cannot save/restore G in TLS, and if a signal is
+ // received during C execution we cannot get the G. Therefore don't
+ // send signals.
+ // This can only happen in the go_bootstrap program (otherwise cgo is
+ // required).
+ return
+ }
signalM(mp, sigPreempt)
}