mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: use SIGKILL if SIGQUIT is blocked; skip tests that need SIGQUIT
The runtime tests may be invoked from a parent that has SIGQUIT blocked. For example, Java invokes subprocesses this way. In this situation, TestCrashDumpsAllThreads and TestPanicSystemstack will fail because they depend on SIGQUIT to get tracebacks, and any subprocess test that times out will fail to kill the subprocess. Fix this by detecting if SIGQUIT is blocked and, if so, skipping tests that depend on it and using SIGKILL to kill timed-out subprocesses. Based on a fix by Carl Henrik Lunde in https://golang.org/issue/19196#issuecomment-316145733 Fixes #19196. Change-Id: Ia20bf15b96086487d0ef6b75239dcc260c21714c Reviewed-on: https://go-review.googlesource.com/50330 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
28f650a2f7
commit
37b7880d15
2 changed files with 36 additions and 0 deletions
|
|
@ -24,6 +24,15 @@ import (
|
|||
// Send SIGQUIT to get a stack trace.
|
||||
var sigquit = syscall.SIGQUIT
|
||||
|
||||
func init() {
|
||||
if runtime.Sigisblocked(int(syscall.SIGQUIT)) {
|
||||
// We can't use SIGQUIT to kill subprocesses because
|
||||
// it's blocked. Use SIGKILL instead. See issue
|
||||
// #19196 for an example of when this happens.
|
||||
sigquit = syscall.SIGKILL
|
||||
}
|
||||
}
|
||||
|
||||
func TestCrashDumpsAllThreads(t *testing.T) {
|
||||
switch runtime.GOOS {
|
||||
case "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
|
||||
|
|
@ -31,6 +40,10 @@ func TestCrashDumpsAllThreads(t *testing.T) {
|
|||
t.Skipf("skipping; not supported on %v", runtime.GOOS)
|
||||
}
|
||||
|
||||
if runtime.Sigisblocked(int(syscall.SIGQUIT)) {
|
||||
t.Skip("skipping; SIGQUIT is blocked, see golang.org/issue/19196")
|
||||
}
|
||||
|
||||
// We don't use executeTest because we need to kill the
|
||||
// program while it is running.
|
||||
|
||||
|
|
@ -165,6 +178,10 @@ func TestPanicSystemstack(t *testing.T) {
|
|||
t.Skip("Skipping in short mode (GOTRACEBACK=crash is slow)")
|
||||
}
|
||||
|
||||
if runtime.Sigisblocked(int(syscall.SIGQUIT)) {
|
||||
t.Skip("skipping; SIGQUIT is blocked, see golang.org/issue/19196")
|
||||
}
|
||||
|
||||
t.Parallel()
|
||||
cmd := exec.Command(os.Args[0], "testPanicSystemstackInternal")
|
||||
cmd = testEnv(cmd)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue