From 7db77271e423604c3b58b4c4da60ddc3c3eecc0d Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 17 Nov 2015 11:41:06 +0100 Subject: 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 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/runtime/os1_linux.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'src/runtime/os1_linux.go') 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) } -- cgit v1.3-5-g9baa