mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: allow signal.Ignore of user-generated throwing signals
Today, signal.Ignore(syscall.SIGTRAP) does nothing while signal.Notify(make(chan os.Signal), syscall.SIGTRAP) correctly discards user-generated SIGTRAPs. The same applies to any signal that we throw on. Make signal.Ignore work for these signals. Fixes #12906. Change-Id: Iba244813051e0ce23fa32fbad3e3fa596a941094 Reviewed-on: https://go-review.googlesource.com/18348 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
331a6055ab
commit
81adfa508a
9 changed files with 72 additions and 6 deletions
|
|
@ -34,12 +34,13 @@ import (
|
|||
)
|
||||
|
||||
var sig struct {
|
||||
note note
|
||||
mask [(_NSIG + 31) / 32]uint32
|
||||
wanted [(_NSIG + 31) / 32]uint32
|
||||
recv [(_NSIG + 31) / 32]uint32
|
||||
state uint32
|
||||
inuse bool
|
||||
note note
|
||||
mask [(_NSIG + 31) / 32]uint32
|
||||
wanted [(_NSIG + 31) / 32]uint32
|
||||
ignored [(_NSIG + 31) / 32]uint32
|
||||
recv [(_NSIG + 31) / 32]uint32
|
||||
state uint32
|
||||
inuse bool
|
||||
}
|
||||
|
||||
const (
|
||||
|
|
@ -146,6 +147,7 @@ func signal_enable(s uint32) {
|
|||
return
|
||||
}
|
||||
sig.wanted[s/32] |= 1 << (s & 31)
|
||||
sig.ignored[s/32] &^= 1 << (s & 31)
|
||||
sigenable(s)
|
||||
}
|
||||
|
||||
|
|
@ -166,9 +168,15 @@ func signal_ignore(s uint32) {
|
|||
return
|
||||
}
|
||||
sig.wanted[s/32] &^= 1 << (s & 31)
|
||||
sig.ignored[s/32] |= 1 << (s & 31)
|
||||
sigignore(s)
|
||||
}
|
||||
|
||||
// Checked by signal handlers.
|
||||
func signal_ignored(s uint32) bool {
|
||||
return sig.ignored[s/32]&(1<<(s&31)) != 0
|
||||
}
|
||||
|
||||
// This runs on a foreign stack, without an m or a g. No stack split.
|
||||
//go:nosplit
|
||||
//go:norace
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue