Commit fdc16716 authored by Ian Lance Taylor's avatar Ian Lance Taylor

runtime: remove sigmask type, use sigset instead

The OS-independent sigmask type was not pulling its weight. Replace it
with the OS-dependent sigset type. This requires adding an OS-specific
sigaddset function, but permits removing the OS-specific sigmaskToSigset
function.

Change-Id: I43307b512b0264ec291baadaea902f05ce212305
Reviewed-on: https://go-review.googlesource.com/29950
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent e13df02e
...@@ -300,10 +300,8 @@ func setSignalstackSP(s *stackt, sp uintptr) { ...@@ -300,10 +300,8 @@ func setSignalstackSP(s *stackt, sp uintptr) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func sigmaskToSigset(m sigmask) sigset { func sigaddset(mask *sigset, i int) {
var set sigset mask.__sigbits[(i-1)/32] |= 1 << ((uint32(i) - 1) & 31)
copy(set.__sigbits[:], m[:])
return set
} }
func sigdelset(mask *sigset, i int) { func sigdelset(mask *sigset, i int) {
......
...@@ -544,8 +544,8 @@ func setSignalstackSP(s *stackt, sp uintptr) { ...@@ -544,8 +544,8 @@ func setSignalstackSP(s *stackt, sp uintptr) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func sigmaskToSigset(m sigmask) sigset { func sigaddset(mask *sigset, i int) {
return sigset(m[0]) *mask |= 1 << (uint32(i) - 1)
} }
func sigdelset(mask *sigset, i int) { func sigdelset(mask *sigset, i int) {
......
...@@ -273,10 +273,8 @@ func setSignalstackSP(s *stackt, sp uintptr) { ...@@ -273,10 +273,8 @@ func setSignalstackSP(s *stackt, sp uintptr) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func sigmaskToSigset(m sigmask) sigset { func sigaddset(mask *sigset, i int) {
var set sigset mask.__bits[(i-1)/32] |= 1 << ((uint32(i) - 1) & 31)
copy(set.__bits[:], m[:])
return set
} }
func sigdelset(mask *sigset, i int) { func sigdelset(mask *sigset, i int) {
......
...@@ -263,10 +263,8 @@ func setSignalstackSP(s *stackt, sp uintptr) { ...@@ -263,10 +263,8 @@ func setSignalstackSP(s *stackt, sp uintptr) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func sigmaskToSigset(m sigmask) sigset { func sigaddset(mask *sigset, i int) {
var set sigset mask.__bits[(i-1)/32] |= 1 << ((uint32(i) - 1) & 31)
copy(set.__bits[:], m[:])
return set
} }
func sigdelset(mask *sigset, i int) { func sigdelset(mask *sigset, i int) {
......
...@@ -31,6 +31,8 @@ type rlimit struct { ...@@ -31,6 +31,8 @@ type rlimit struct {
var sigset_all = sigset{^uint32(0), ^uint32(0)} var sigset_all = sigset{^uint32(0), ^uint32(0)}
//go:nosplit
//go:nowritebarrierrec
func sigaddset(mask *sigset, i int) { func sigaddset(mask *sigset, i int) {
(*mask)[(i-1)/32] |= 1 << ((uint32(i) - 1) & 31) (*mask)[(i-1)/32] |= 1 << ((uint32(i) - 1) & 31)
} }
...@@ -42,11 +44,3 @@ func sigdelset(mask *sigset, i int) { ...@@ -42,11 +44,3 @@ func sigdelset(mask *sigset, i int) {
func sigfillset(mask *uint64) { func sigfillset(mask *uint64) {
*mask = ^uint64(0) *mask = ^uint64(0)
} }
//go:nosplit
//go:nowritebarrierrec
func sigmaskToSigset(m sigmask) sigset {
var set sigset
copy(set[:], m[:])
return set
}
...@@ -47,6 +47,8 @@ type rlimit struct { ...@@ -47,6 +47,8 @@ type rlimit struct {
var sigset_all = sigset{^uint64(0), ^uint64(0)} var sigset_all = sigset{^uint64(0), ^uint64(0)}
//go:nosplit
//go:nowritebarrierrec
func sigaddset(mask *sigset, i int) { func sigaddset(mask *sigset, i int) {
(*mask)[(i-1)/64] |= 1 << ((uint32(i) - 1) & 63) (*mask)[(i-1)/64] |= 1 << ((uint32(i) - 1) & 63)
} }
...@@ -58,11 +60,3 @@ func sigdelset(mask *sigset, i int) { ...@@ -58,11 +60,3 @@ func sigdelset(mask *sigset, i int) {
func sigfillset(mask *[2]uint64) { func sigfillset(mask *[2]uint64) {
(*mask)[0], (*mask)[1] = ^uint64(0), ^uint64(0) (*mask)[0], (*mask)[1] = ^uint64(0), ^uint64(0)
} }
//go:nosplit
//go:nowritebarrierrec
func sigmaskToSigset(m sigmask) sigset {
var set sigset
set[0] = uint64(m[0]) | uint64(m[1])<<32
return set
}
...@@ -23,6 +23,8 @@ type rlimit struct { ...@@ -23,6 +23,8 @@ type rlimit struct {
var sigset_all = sigset(^uint64(0)) var sigset_all = sigset(^uint64(0))
//go:nosplit
//go:nowritebarrierrec
func sigaddset(mask *sigset, i int) { func sigaddset(mask *sigset, i int) {
if i > 64 { if i > 64 {
throw("unexpected signal greater than 64") throw("unexpected signal greater than 64")
...@@ -40,9 +42,3 @@ func sigdelset(mask *sigset, i int) { ...@@ -40,9 +42,3 @@ func sigdelset(mask *sigset, i int) {
func sigfillset(mask *uint64) { func sigfillset(mask *uint64) {
*mask = ^uint64(0) *mask = ^uint64(0)
} }
//go:nosplit
//go:nowritebarrierrec
func sigmaskToSigset(m sigmask) sigset {
return sigset(uint64(m[0]) | uint64(m[1])<<32)
}
...@@ -301,10 +301,8 @@ func setSignalstackSP(s *stackt, sp uintptr) { ...@@ -301,10 +301,8 @@ func setSignalstackSP(s *stackt, sp uintptr) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func sigmaskToSigset(m sigmask) sigset { func sigaddset(mask *sigset, i int) {
var set sigset mask.__bits[(i-1)/32] |= 1 << ((uint32(i) - 1) & 31)
copy(set.__bits[:], m[:])
return set
} }
func sigdelset(mask *sigset, i int) { func sigdelset(mask *sigset, i int) {
......
...@@ -279,8 +279,8 @@ func setSignalstackSP(s *stackt, sp uintptr) { ...@@ -279,8 +279,8 @@ func setSignalstackSP(s *stackt, sp uintptr) {
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func sigmaskToSigset(m sigmask) sigset { func sigaddset(mask *sigset, i int) {
return sigset(m[0]) *mask |= 1 << (uint32(i) - 1)
} }
func sigdelset(mask *sigset, i int) { func sigdelset(mask *sigset, i int) {
......
...@@ -36,11 +36,6 @@ const ( ...@@ -36,11 +36,6 @@ const (
// Signal forwarding is currently available only on Darwin and Linux. // Signal forwarding is currently available only on Darwin and Linux.
var fwdSig [_NSIG]uintptr var fwdSig [_NSIG]uintptr
// sigmask represents a general signal mask compatible with the GOOS
// specific sigset types: the signal numbered x is represented by bit x-1
// to match the representation expected by sigprocmask.
type sigmask [(_NSIG + 31) / 32]uint32
// channels for synchronizing signal mask updates with the signal mask // channels for synchronizing signal mask updates with the signal mask
// thread // thread
var ( var (
...@@ -302,7 +297,7 @@ func sigpanic() { ...@@ -302,7 +297,7 @@ func sigpanic() {
//go:nowritebarrierrec //go:nowritebarrierrec
func dieFromSignal(sig int32) { func dieFromSignal(sig int32) {
setsig(sig, _SIG_DFL, false) setsig(sig, _SIG_DFL, false)
updatesigmask(sigmask{}) unblocksig(sig)
raise(sig) raise(sig)
// That should have killed us. On some systems, though, raise // That should have killed us. On some systems, though, raise
...@@ -401,28 +396,25 @@ func ensureSigM() { ...@@ -401,28 +396,25 @@ func ensureSigM() {
// initially all signals except the essential. When signal.Notify()/Stop is called, // initially all signals except the essential. When signal.Notify()/Stop is called,
// sigenable/sigdisable in turn notify this thread to update its signal // sigenable/sigdisable in turn notify this thread to update its signal
// mask accordingly. // mask accordingly.
var sigBlocked sigmask sigBlocked := sigset_all
for i := range sigBlocked {
sigBlocked[i] = ^uint32(0)
}
for i := range sigtable { for i := range sigtable {
if sigtable[i].flags&_SigUnblock != 0 { if sigtable[i].flags&_SigUnblock != 0 {
sigBlocked[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31) sigdelset(&sigBlocked, i)
} }
} }
updatesigmask(sigBlocked) sigprocmask(_SIG_SETMASK, &sigBlocked, nil)
for { for {
select { select {
case sig := <-enableSigChan: case sig := <-enableSigChan:
if b := sig - 1; sig > 0 { if sig > 0 {
sigBlocked[b/32] &^= (1 << (b & 31)) sigdelset(&sigBlocked, int(sig))
} }
case sig := <-disableSigChan: case sig := <-disableSigChan:
if b := sig - 1; sig > 0 { if sig > 0 {
sigBlocked[b/32] |= (1 << (b & 31)) sigaddset(&sigBlocked, int(sig))
} }
} }
updatesigmask(sigBlocked) sigprocmask(_SIG_SETMASK, &sigBlocked, nil)
maskUpdatedChan <- struct{}{} maskUpdatedChan <- struct{}{}
} }
}() }()
...@@ -554,22 +546,15 @@ func sigblock() { ...@@ -554,22 +546,15 @@ func sigblock() {
sigprocmask(_SIG_SETMASK, &sigset_all, nil) sigprocmask(_SIG_SETMASK, &sigset_all, nil)
} }
// updatesigmask sets the current thread's signal mask to m. // unblocksig removes sig from the current thread's signal mask.
// This is nosplit and nowritebarrierrec because it is called from // This is nosplit and nowritebarrierrec because it is called from
// dieFromSignal, which can be called by sigfwdgo while running in the // dieFromSignal, which can be called by sigfwdgo while running in the
// signal handler, on the signal stack, with no g available. // signal handler, on the signal stack, with no g available.
//go:nosplit //go:nosplit
//go:nowritebarrierrec //go:nowritebarrierrec
func updatesigmask(m sigmask) {
set := sigmaskToSigset(m)
sigprocmask(_SIG_SETMASK, &set, nil)
}
// unblocksig removes sig from the current thread's signal mask.
func unblocksig(sig int32) { func unblocksig(sig int32) {
var m sigmask var set sigset
m[(sig-1)/32] |= 1 << ((uint32(sig) - 1) & 31) sigaddset(&set, int(sig))
set := sigmaskToSigset(m)
sigprocmask(_SIG_UNBLOCK, &set, nil) sigprocmask(_SIG_UNBLOCK, &set, nil)
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment