mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: stop preemption during syscall.Exec on Darwin
On current macOS versions a program that receives a signal during an execve can fail with a SIGILL signal. This appears to be a macOS kernel bug. It has been reported to Apple. This CL partially works around the problem by using execLock to not send preemption signals during execve. Of course some other stray signal could occur, but at least we can avoid exacerbating the problem. We can't simply disable signals, as that would mean that the exec'ed process would start with all signals blocked, which it likely does not expect. Fixes #41702 Change-Id: I91b0add967b315671ddcf73269c4d30136e579b4 Reviewed-on: https://go-review.googlesource.com/c/go/+/262438 Trust: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
497ea0610e
commit
64fb6ae95f
2 changed files with 56 additions and 0 deletions
|
|
@ -356,6 +356,13 @@ func preemptM(mp *m) {
|
|||
// required).
|
||||
return
|
||||
}
|
||||
|
||||
// On Darwin, don't try to preempt threads during exec.
|
||||
// Issue #41702.
|
||||
if GOOS == "darwin" {
|
||||
execLock.rlock()
|
||||
}
|
||||
|
||||
if atomic.Cas(&mp.signalPending, 0, 1) {
|
||||
// If multiple threads are preempting the same M, it may send many
|
||||
// signals to the same M such that it hardly make progress, causing
|
||||
|
|
@ -364,6 +371,10 @@ func preemptM(mp *m) {
|
|||
// Only send a signal if there isn't already one pending.
|
||||
signalM(mp, sigPreempt)
|
||||
}
|
||||
|
||||
if GOOS == "darwin" {
|
||||
execLock.runlock()
|
||||
}
|
||||
}
|
||||
|
||||
// sigFetchG fetches the value of G safely when running in a signal handler.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue