From 67f0f83216930e053441500e2b28c3fa2b667581 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 25 Nov 2019 23:29:02 -0500 Subject: [PATCH] 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 --- src/runtime/signal_unix.go | 10 ++++++++++ 1 file changed, 10 insertions(+) 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) } -- 2.48.1