mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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>
This commit is contained in:
parent
20bf6a495e
commit
67f0f83216
1 changed files with 10 additions and 0 deletions
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue