mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: wait for preemption signals before syscall.Exec
Fixes #41702 Fixes #42023 Change-Id: If07f40b1d73b8f276ee28ffb8b7214175e56c24d Reviewed-on: https://go-review.googlesource.com/c/go/+/262817 Trust: Ian Lance Taylor <iant@golang.org> Trust: Bryan C. Mills <bcmills@google.com> 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
3eae1a9058
commit
05739d6f17
2 changed files with 32 additions and 0 deletions
|
|
@ -335,6 +335,10 @@ func doSigPreempt(gp *g, ctxt *sigctxt) {
|
|||
// Acknowledge the preemption.
|
||||
atomic.Xadd(&gp.m.preemptGen, 1)
|
||||
atomic.Store(&gp.m.signalPending, 0)
|
||||
|
||||
if GOOS == "darwin" {
|
||||
atomic.Xadd(&pendingPreemptSignals, -1)
|
||||
}
|
||||
}
|
||||
|
||||
const preemptMSupported = true
|
||||
|
|
@ -364,6 +368,10 @@ func preemptM(mp *m) {
|
|||
}
|
||||
|
||||
if atomic.Cas(&mp.signalPending, 0, 1) {
|
||||
if GOOS == "darwin" {
|
||||
atomic.Xadd(&pendingPreemptSignals, 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
|
||||
// live-lock problem. Apparently this could happen on darwin. See
|
||||
|
|
@ -435,6 +443,9 @@ func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) {
|
|||
// no non-Go signal handler for sigPreempt.
|
||||
// The default behavior for sigPreempt is to ignore
|
||||
// the signal, so badsignal will be a no-op anyway.
|
||||
if GOOS == "darwin" {
|
||||
atomic.Xadd(&pendingPreemptSignals, -1)
|
||||
}
|
||||
return
|
||||
}
|
||||
c.fixsigcode(sig)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue