aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/os3_solaris.go
diff options
context:
space:
mode:
authorElias Naur <elias.naur@gmail.com>2015-11-17 11:41:06 +0100
committerRuss Cox <rsc@golang.org>2015-11-24 17:16:47 +0000
commita7383fc4670947ffa513aae4ce2c8917d753da26 (patch)
tree9c2bff480ac2e430e4174043c11be55acb3505a0 /src/runtime/os3_solaris.go
parent0ae57c3b0b95310dd86ac0e0251048136d5a2d99 (diff)
downloadgo-a7383fc4670947ffa513aae4ce2c8917d753da26.tar.gz
go-a7383fc4670947ffa513aae4ce2c8917d753da26.zip
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. [Replay of CL 16942 by Elias Naur.] Change-Id: I98f144d626033ae5318576115ed635415ac71b2c Reviewed-on: https://go-review.googlesource.com/17033 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/runtime/os3_solaris.go')
-rw-r--r--src/runtime/os3_solaris.go11
1 files changed, 3 insertions, 8 deletions
diff --git a/src/runtime/os3_solaris.go b/src/runtime/os3_solaris.go
index ad697487b0..0e6d2e55da 100644
--- a/src/runtime/os3_solaris.go
+++ b/src/runtime/os3_solaris.go
@@ -194,17 +194,12 @@ func miniterrno()
//go:nosplit
func msigsave(mp *m) {
- smask := (*sigset)(unsafe.Pointer(&mp.sigmask))
- if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) {
- throw("insufficient storage for signal mask")
- }
- sigprocmask(_SIG_SETMASK, nil, smask)
+ sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
}
//go:nosplit
func msigrestore(mp *m) {
- smask := (*sigset)(unsafe.Pointer(&mp.sigmask))
- sigprocmask(_SIG_SETMASK, smask, nil)
+ sigprocmask(_SIG_SETMASK, &mp.sigmask, nil)
}
//go:nosplit
@@ -221,7 +216,7 @@ func minit() {
signalstack(&_g_.m.gsignal.stack)
// 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 {
nmask.__sigbits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)