aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/os1_linux.go
diff options
context:
space:
mode:
authorElias Naur <elias.naur@gmail.com>2015-11-17 11:41:06 +0100
committerIan Lance Taylor <iant@golang.org>2015-11-17 21:23:06 +0000
commit7db77271e423604c3b58b4c4da60ddc3c3eecc0d (patch)
tree8050bbe90812de35dec8eb238637d120d90b397f /src/runtime/os1_linux.go
parent07d48993f257a6536d83555bb8cc9daffa07dd56 (diff)
downloadgo-7db77271e423604c3b58b4c4da60ddc3c3eecc0d.tar.xz
runtime: use a proper type, sigset, for m.sigmask
Replace the cross platform but unsafe [4]uintptr type with a OS specific type, sigset. Most OSes already define sigset, and this change defines a suitable sigset for the OSes that don't (darwin, openbsd). The OSes that don't use m.sigmask (windows, plan9, nacl) now defines sigset as the empty type, struct{}. The gain is strongly typed access to m.sigmask, saving a dynamic size sanity check and unsafe.Pointer casting. Also, some storage is saved for each M, since [4]uinptr was conservative for most OSes. The cost is that OSes that don't need m.sigmask has to define sigset. completes ./all.bash with GOOS linux, on amd64 completes ./make.bash with GOOSes openbsd, android, plan9, windows, darwin, solaris, netbsd, freebsd, dragonfly, all amd64. With GOOS=nacl ./make.bash failed with a seemingly unrelated error. R=go1.7 Change-Id: Ib460379f063eb83d393e1c5efe7333a643c1595e Reviewed-on: https://go-review.googlesource.com/16942 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/os1_linux.go')
-rw-r--r--src/runtime/os1_linux.go9
1 files changed, 3 insertions, 6 deletions
diff --git a/src/runtime/os1_linux.go b/src/runtime/os1_linux.go
index 8b5cdd3465..5977b8437f 100644
--- a/src/runtime/os1_linux.go
+++ b/src/runtime/os1_linux.go
@@ -198,10 +198,7 @@ func mpreinit(mp *m) {
}
func msigsave(mp *m) {
- smask := (*sigset)(unsafe.Pointer(&mp.sigmask))
- if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) {
- throw("insufficient storage for signal mask")
- }
+ smask := &mp.sigmask
rtsigprocmask(_SIG_SETMASK, nil, smask, int32(unsafe.Sizeof(*smask)))
}
@@ -218,7 +215,7 @@ func minit() {
_g_.m.procid = uint64(gettid())
// restore signal mask from m.sigmask and unblock essential signals
- nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
+ nmask := _g_.m.sigmask
for i := range sigtable {
if sigtable[i].flags&_SigUnblock != 0 {
sigdelset(&nmask, i)
@@ -230,7 +227,7 @@ func minit() {
// Called from dropm to undo the effect of an minit.
func unminit() {
_g_ := getg()
- smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
+ smask := &_g_.m.sigmask
rtsigprocmask(_SIG_SETMASK, smask, nil, int32(unsafe.Sizeof(*smask)))
signalstack(nil)
}