]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: remove sigmask type, use sigset instead
authorIan Lance Taylor <iant@golang.org>
Tue, 27 Sep 2016 20:42:28 +0000 (13:42 -0700)
committerIan Lance Taylor <iant@golang.org>
Tue, 27 Sep 2016 21:33:44 +0000 (21:33 +0000)
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: Brad Fitzpatrick <bradfitz@golang.org>
src/runtime/os3_solaris.go
src/runtime/os_darwin.go
src/runtime/os_dragonfly.go
src/runtime/os_freebsd.go
src/runtime/os_linux_generic.go
src/runtime/os_linux_mips64x.go
src/runtime/os_linux_s390x.go
src/runtime/os_netbsd.go
src/runtime/os_openbsd.go
src/runtime/signal_unix.go

index 144d9cdc1f5f0135cd1dc52d539e59c52839ec97..322a57c27f7c36db48dc88ce6c1a00b6da6e976f 100644 (file)
@@ -300,10 +300,8 @@ func setSignalstackSP(s *stackt, sp uintptr) {
 
 //go:nosplit
 //go:nowritebarrierrec
-func sigmaskToSigset(m sigmask) sigset {
-       var set sigset
-       copy(set.__sigbits[:], m[:])
-       return set
+func sigaddset(mask *sigset, i int) {
+       mask.__sigbits[(i-1)/32] |= 1 << ((uint32(i) - 1) & 31)
 }
 
 func sigdelset(mask *sigset, i int) {
index 5061dde1c5321d5faaa32372f952905e67b56e5f..c59fd9b8fc8af3ac1eb9463864fe5ab6d09bef0a 100644 (file)
@@ -544,8 +544,8 @@ func setSignalstackSP(s *stackt, sp uintptr) {
 
 //go:nosplit
 //go:nowritebarrierrec
-func sigmaskToSigset(m sigmask) sigset {
-       return sigset(m[0])
+func sigaddset(mask *sigset, i int) {
+       *mask |= 1 << (uint32(i) - 1)
 }
 
 func sigdelset(mask *sigset, i int) {
index df73346a18a759402102e766247b175843417a38..495f41805b09812d201f3e5b5ce3a8202627a025 100644 (file)
@@ -273,10 +273,8 @@ func setSignalstackSP(s *stackt, sp uintptr) {
 
 //go:nosplit
 //go:nowritebarrierrec
-func sigmaskToSigset(m sigmask) sigset {
-       var set sigset
-       copy(set.__bits[:], m[:])
-       return set
+func sigaddset(mask *sigset, i int) {
+       mask.__bits[(i-1)/32] |= 1 << ((uint32(i) - 1) & 31)
 }
 
 func sigdelset(mask *sigset, i int) {
index 2fc020e528958594655b61e316c747d71915d7d3..d0b3d27c669945d252eb5edbef03f75afb4b3fd2 100644 (file)
@@ -263,10 +263,8 @@ func setSignalstackSP(s *stackt, sp uintptr) {
 
 //go:nosplit
 //go:nowritebarrierrec
-func sigmaskToSigset(m sigmask) sigset {
-       var set sigset
-       copy(set.__bits[:], m[:])
-       return set
+func sigaddset(mask *sigset, i int) {
+       mask.__bits[(i-1)/32] |= 1 << ((uint32(i) - 1) & 31)
 }
 
 func sigdelset(mask *sigset, i int) {
index 636e248463d86c53d110205c9455f5fc460e1c11..94e5ed996f302b78eec0ef079cfdcdae8cc6a780 100644 (file)
@@ -31,6 +31,8 @@ type rlimit struct {
 
 var sigset_all = sigset{^uint32(0), ^uint32(0)}
 
+//go:nosplit
+//go:nowritebarrierrec
 func sigaddset(mask *sigset, i int) {
        (*mask)[(i-1)/32] |= 1 << ((uint32(i) - 1) & 31)
 }
@@ -42,11 +44,3 @@ func sigdelset(mask *sigset, i int) {
 func sigfillset(mask *uint64) {
        *mask = ^uint64(0)
 }
-
-//go:nosplit
-//go:nowritebarrierrec
-func sigmaskToSigset(m sigmask) sigset {
-       var set sigset
-       copy(set[:], m[:])
-       return set
-}
index 8fbeb3dc8d53a66c80a6a63ddeceff17945870dc..1c690fed0a12701415b2a72354e2914af4235e7f 100644 (file)
@@ -47,6 +47,8 @@ type rlimit struct {
 
 var sigset_all = sigset{^uint64(0), ^uint64(0)}
 
+//go:nosplit
+//go:nowritebarrierrec
 func sigaddset(mask *sigset, i int) {
        (*mask)[(i-1)/64] |= 1 << ((uint32(i) - 1) & 63)
 }
@@ -58,11 +60,3 @@ func sigdelset(mask *sigset, i int) {
 func sigfillset(mask *[2]uint64) {
        (*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
-}
index 0fb48c031041de99f0a59c423cfd72a7f1803953..bdda2a3a6e981574dca36388ad68946ac79bef2a 100644 (file)
@@ -23,6 +23,8 @@ type rlimit struct {
 
 var sigset_all = sigset(^uint64(0))
 
+//go:nosplit
+//go:nowritebarrierrec
 func sigaddset(mask *sigset, i int) {
        if i > 64 {
                throw("unexpected signal greater than 64")
@@ -40,9 +42,3 @@ func sigdelset(mask *sigset, i int) {
 func sigfillset(mask *uint64) {
        *mask = ^uint64(0)
 }
-
-//go:nosplit
-//go:nowritebarrierrec
-func sigmaskToSigset(m sigmask) sigset {
-       return sigset(uint64(m[0]) | uint64(m[1])<<32)
-}
index 38deb26e9122a6f75b9970e3acbe96de5abf7479..63611e2175ad89f3d0b2bbe738b6f84cd3b0d860 100644 (file)
@@ -301,10 +301,8 @@ func setSignalstackSP(s *stackt, sp uintptr) {
 
 //go:nosplit
 //go:nowritebarrierrec
-func sigmaskToSigset(m sigmask) sigset {
-       var set sigset
-       copy(set.__bits[:], m[:])
-       return set
+func sigaddset(mask *sigset, i int) {
+       mask.__bits[(i-1)/32] |= 1 << ((uint32(i) - 1) & 31)
 }
 
 func sigdelset(mask *sigset, i int) {
index d6db2518f3546349c806bbcd708fceb0873814fa..14af045cbd7e2e2456a5e84f8191f82e1a6ae7d9 100644 (file)
@@ -279,8 +279,8 @@ func setSignalstackSP(s *stackt, sp uintptr) {
 
 //go:nosplit
 //go:nowritebarrierrec
-func sigmaskToSigset(m sigmask) sigset {
-       return sigset(m[0])
+func sigaddset(mask *sigset, i int) {
+       *mask |= 1 << (uint32(i) - 1)
 }
 
 func sigdelset(mask *sigset, i int) {
index d74cb3bf3af457ae5ae2e5b9d129cc66ad9b1871..e807d695c75505ea922b1f6875da403eacc562a9 100644 (file)
@@ -36,11 +36,6 @@ const (
 // Signal forwarding is currently available only on Darwin and Linux.
 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
 // thread
 var (
@@ -302,7 +297,7 @@ func sigpanic() {
 //go:nowritebarrierrec
 func dieFromSignal(sig int32) {
        setsig(sig, _SIG_DFL, false)
-       updatesigmask(sigmask{})
+       unblocksig(sig)
        raise(sig)
 
        // That should have killed us. On some systems, though, raise
@@ -401,28 +396,25 @@ func ensureSigM() {
                // initially all signals except the essential. When signal.Notify()/Stop is called,
                // sigenable/sigdisable in turn notify this thread to update its signal
                // mask accordingly.
-               var sigBlocked sigmask
-               for i := range sigBlocked {
-                       sigBlocked[i] = ^uint32(0)
-               }
+               sigBlocked := sigset_all
                for i := range sigtable {
                        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 {
                        select {
                        case sig := <-enableSigChan:
-                               if b := sig - 1; sig > 0 {
-                                       sigBlocked[b/32] &^= (1 << (b & 31))
+                               if sig > 0 {
+                                       sigdelset(&sigBlocked, int(sig))
                                }
                        case sig := <-disableSigChan:
-                               if b := sig - 1; sig > 0 {
-                                       sigBlocked[b/32] |= (1 << (b & 31))
+                               if sig > 0 {
+                                       sigaddset(&sigBlocked, int(sig))
                                }
                        }
-                       updatesigmask(sigBlocked)
+                       sigprocmask(_SIG_SETMASK, &sigBlocked, nil)
                        maskUpdatedChan <- struct{}{}
                }
        }()
@@ -554,22 +546,15 @@ func sigblock() {
        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
 // dieFromSignal, which can be called by sigfwdgo while running in the
 // signal handler, on the signal stack, with no g available.
 //go:nosplit
 //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) {
-       var m sigmask
-       m[(sig-1)/32] |= 1 << ((uint32(sig) - 1) & 31)
-       set := sigmaskToSigset(m)
+       var set sigset
+       sigaddset(&set, int(sig))
        sigprocmask(_SIG_UNBLOCK, &set, nil)
 }