mirror of
https://github.com/golang/go.git
synced 2025-05-29 11:25:43 +00:00
runtime: when disabling SIGPROF handler, ignore SIGPROF
If the runtime disables the SIGPROF handler, because this is Go code that is linked into a non-Go program, then don't go back to the default handling of SIGPROF; just start ignoring SIGPROF. Otherwise the program can get killed by a stray SIGPROF that is delivered, presumably to a different thread, after profiling is disabled. Fixes #19320 Change-Id: Ifebae477d726699c8c82c867604b73110c1cf262 Reviewed-on: https://go-review.googlesource.com/c/go/+/200740 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Bryan C. Mills <bcmills@google.com>
This commit is contained in:
parent
33fac9bad8
commit
fd33b2c974
@ -242,10 +242,26 @@ func setProcessCPUProfiler(hz int32) {
|
||||
}
|
||||
} else {
|
||||
// If the Go signal handler should be disabled by default,
|
||||
// disable it if it is enabled.
|
||||
// switch back to the signal handler that was installed
|
||||
// when we enabled profiling. We don't try to handle the case
|
||||
// of a program that changes the SIGPROF handler while Go
|
||||
// profiling is enabled.
|
||||
//
|
||||
// If no signal handler was installed before, then start
|
||||
// ignoring SIGPROF signals. We do this, rather than change
|
||||
// to SIG_DFL, because there may be a pending SIGPROF
|
||||
// signal that has not yet been delivered to some other thread.
|
||||
// If we change to SIG_DFL here, the program will crash
|
||||
// when that SIGPROF is delivered. We assume that programs
|
||||
// that use profiling don't want to crash on a stray SIGPROF.
|
||||
// See issue 19320.
|
||||
if !sigInstallGoHandler(_SIGPROF) {
|
||||
if atomic.Cas(&handlingSig[_SIGPROF], 1, 0) {
|
||||
setsig(_SIGPROF, atomic.Loaduintptr(&fwdSig[_SIGPROF]))
|
||||
h := atomic.Loaduintptr(&fwdSig[_SIGPROF])
|
||||
if h == _SIG_DFL {
|
||||
h = _SIG_IGN
|
||||
}
|
||||
setsig(_SIGPROF, h)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user