From: Cherry Zhang Date: Tue, 26 Nov 2019 04:29:02 +0000 (-0500) Subject: runtime: disable async preemption on darwin/arm(64) if no cgo X-Git-Tag: go1.14beta1~99 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=67f0f83216930e053441500e2b28c3fa2b667581;p=gostls13.git 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 TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- 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) }