Commit 67f0f832 authored by Cherry Zhang's avatar Cherry Zhang

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: default avatarIan Lance Taylor <iant@golang.org>
parent 20bf6a49
......@@ -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)
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment