]> Cypherpunks repositories - gostls13.git/commitdiff
Revert "runtime: use a proper type, sigset, for m.sigmask"
authorRuss Cox <rsc@golang.org>
Wed, 18 Nov 2015 17:18:08 +0000 (17:18 +0000)
committerRuss Cox <rsc@golang.org>
Wed, 18 Nov 2015 17:18:20 +0000 (17:18 +0000)
This reverts commit 7db77271e423604c3b58b4c4da60ddc3c3eecc0d.

Change-Id: I6d8855eb05ca331025dc49a5533c6da4d1fa4e84
Reviewed-on: https://go-review.googlesource.com/17030
Reviewed-by: Russ Cox <rsc@golang.org>
13 files changed:
src/runtime/os1_darwin.go
src/runtime/os1_dragonfly.go
src/runtime/os1_freebsd.go
src/runtime/os1_linux.go
src/runtime/os1_nacl.go
src/runtime/os1_netbsd.go
src/runtime/os1_openbsd.go
src/runtime/os1_plan9.go
src/runtime/os1_windows.go
src/runtime/os3_solaris.go
src/runtime/os_darwin.go
src/runtime/os_openbsd.go
src/runtime/runtime2.go

index e702739508e2c3f0c59d7eb590492db7cf51062e..ba38a78ed1974dff4e022da9eed66e8fd6f90628 100644 (file)
@@ -8,9 +8,7 @@ import "unsafe"
 
 //extern SigTabTT runtimeĀ·sigtab[];
 
-type sigset uint32
-
-var sigset_all = ^sigset(0)
+var sigset_all = ^uint32(0)
 
 func unimplemented(name string) {
        println(name, "not implemented")
@@ -85,7 +83,7 @@ func newosproc(mp *m, stk unsafe.Pointer) {
                print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " id=", mp.id, " ostk=", &mp, "\n")
        }
 
-       var oset sigset
+       var oset uint32
        sigprocmask(_SIG_SETMASK, &sigset_all, &oset)
        errno := bsdthread_create(stk, unsafe.Pointer(mp), funcPC(mstart))
        sigprocmask(_SIG_SETMASK, &oset, nil)
@@ -111,7 +109,7 @@ func newosproc0(stacksize uintptr, fn unsafe.Pointer, fnarg uintptr) {
        }
        stk := unsafe.Pointer(uintptr(stack) + stacksize)
 
-       var oset sigset
+       var oset uint32
        sigprocmask(_SIG_SETMASK, &sigset_all, &oset)
        errno := bsdthread_create(stk, fn, fnarg)
        sigprocmask(_SIG_SETMASK, &oset, nil)
@@ -133,7 +131,11 @@ func mpreinit(mp *m) {
 }
 
 func msigsave(mp *m) {
-       sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
+       smask := (*uint32)(unsafe.Pointer(&mp.sigmask))
+       if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) {
+               throw("insufficient storage for signal mask")
+       }
+       sigprocmask(_SIG_SETMASK, nil, smask)
 }
 
 // Called to initialize a new m (including the bootstrap m).
@@ -144,7 +146,7 @@ func minit() {
        signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
-       nmask := _g_.m.sigmask
+       nmask := *(*uint32)(unsafe.Pointer(&_g_.m.sigmask))
        for i := range sigtable {
                if sigtable[i].flags&_SigUnblock != 0 {
                        nmask &^= 1 << (uint32(i) - 1)
@@ -156,7 +158,8 @@ func minit() {
 // Called from dropm to undo the effect of an minit.
 func unminit() {
        _g_ := getg()
-       sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil)
+       smask := (*uint32)(unsafe.Pointer(&_g_.m.sigmask))
+       sigprocmask(_SIG_SETMASK, smask, nil)
        signalstack(nil)
 }
 
@@ -469,11 +472,10 @@ func signalstack(s *stack) {
 }
 
 func updatesigmask(m sigmask) {
-       s := sigset(m[0])
-       sigprocmask(_SIG_SETMASK, &s, nil)
+       sigprocmask(_SIG_SETMASK, &m[0], nil)
 }
 
 func unblocksig(sig int32) {
-       mask := sigset(1) << (uint32(sig) - 1)
+       mask := uint32(1) << (uint32(sig) - 1)
        sigprocmask(_SIG_UNBLOCK, &mask, nil)
 }
index 916a89e92ff6c9f354fc9851b343cebfe96ccb1a..a1be981f56b88c4fc9417d683767df263cab1703 100644 (file)
@@ -118,7 +118,11 @@ func mpreinit(mp *m) {
 }
 
 func msigsave(mp *m) {
-       sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
+       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)
 }
 
 // Called to initialize a new m (including the bootstrap m).
@@ -133,7 +137,7 @@ func minit() {
        signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
-       nmask := _g_.m.sigmask
+       nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
        for i := range sigtable {
                if sigtable[i].flags&_SigUnblock != 0 {
                        nmask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
@@ -145,7 +149,8 @@ func minit() {
 // Called from dropm to undo the effect of an minit.
 func unminit() {
        _g_ := getg()
-       sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil)
+       smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
+       sigprocmask(_SIG_SETMASK, smask, nil)
        signalstack(nil)
 }
 
index 9f6f8407a6d9d483274b29132909ff34fbb14946..a325620fe6d02cd79af47d4a9f4889e26ae784bd 100644 (file)
@@ -121,7 +121,11 @@ func mpreinit(mp *m) {
 }
 
 func msigsave(mp *m) {
-       sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
+       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)
 }
 
 // Called to initialize a new m (including the bootstrap m).
@@ -139,7 +143,7 @@ func minit() {
        signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
-       nmask := _g_.m.sigmask
+       nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
        for i := range sigtable {
                if sigtable[i].flags&_SigUnblock != 0 {
                        nmask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
@@ -151,7 +155,8 @@ func minit() {
 // Called from dropm to undo the effect of an minit.
 func unminit() {
        _g_ := getg()
-       sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil)
+       smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
+       sigprocmask(_SIG_SETMASK, smask, nil)
        signalstack(nil)
 }
 
index 5977b8437fa33cd33f9d47d65c2f5dc2b84402e6..8b5cdd346557daef0ac631cfbea3295a28e9cb09 100644 (file)
@@ -198,7 +198,10 @@ func mpreinit(mp *m) {
 }
 
 func msigsave(mp *m) {
-       smask := &mp.sigmask
+       smask := (*sigset)(unsafe.Pointer(&mp.sigmask))
+       if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) {
+               throw("insufficient storage for signal mask")
+       }
        rtsigprocmask(_SIG_SETMASK, nil, smask, int32(unsafe.Sizeof(*smask)))
 }
 
@@ -215,7 +218,7 @@ func minit() {
        _g_.m.procid = uint64(gettid())
 
        // restore signal mask from m.sigmask and unblock essential signals
-       nmask := _g_.m.sigmask
+       nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
        for i := range sigtable {
                if sigtable[i].flags&_SigUnblock != 0 {
                        sigdelset(&nmask, i)
@@ -227,7 +230,7 @@ func minit() {
 // Called from dropm to undo the effect of an minit.
 func unminit() {
        _g_ := getg()
-       smask := &_g_.m.sigmask
+       smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
        rtsigprocmask(_SIG_SETMASK, smask, nil, int32(unsafe.Sizeof(*smask)))
        signalstack(nil)
 }
index 3e982616018fce617f3158fb051cca531b70d795..ad4329cecd12ddd39fed8627c329948a0c1f55f9 100644 (file)
@@ -6,8 +6,6 @@ package runtime
 
 import "unsafe"
 
-type sigset struct{}
-
 // Called to initialize a new m (including the bootstrap m).
 // Called on the parent thread (main thread in case of bootstrap), can allocate memory.
 func mpreinit(mp *m) {
index 3e19115a853487df981ffb8d3cfd2784a3757802..3e77d248f79bfa43dedf5620b9a7341ee1862e3d 100644 (file)
@@ -139,7 +139,11 @@ func mpreinit(mp *m) {
 }
 
 func msigsave(mp *m) {
-       sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
+       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)
 }
 
 // Called to initialize a new m (including the bootstrap m).
@@ -152,7 +156,7 @@ func minit() {
        signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
-       nmask := _g_.m.sigmask
+       nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
        for i := range sigtable {
                if sigtable[i].flags&_SigUnblock != 0 {
                        nmask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
@@ -164,7 +168,8 @@ func minit() {
 // Called from dropm to undo the effect of an minit.
 func unminit() {
        _g_ := getg()
-       sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil)
+       smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
+       sigprocmask(_SIG_SETMASK, smask, nil)
 
        signalstack(nil)
 }
index 8c770a72d0d12e9a4982e4c7fdf244af471f7dff..11034a64f664f07dba1494274589ff0daa80c19d 100644 (file)
@@ -22,11 +22,9 @@ const (
        _CLOCK_MONOTONIC = 3
 )
 
-type sigset uint32
-
 const (
-       sigset_none = sigset(0)
-       sigset_all  = ^sigset(0)
+       sigset_none = uint32(0)
+       sigset_all  = ^uint32(0)
 )
 
 // From OpenBSD's <sys/sysctl.h>
@@ -151,7 +149,11 @@ func mpreinit(mp *m) {
 }
 
 func msigsave(mp *m) {
-       mp.sigmask = sigprocmask(_SIG_BLOCK, 0)
+       smask := (*uint32)(unsafe.Pointer(&mp.sigmask))
+       if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) {
+               throw("insufficient storage for signal mask")
+       }
+       *smask = sigprocmask(_SIG_BLOCK, 0)
 }
 
 // Called to initialize a new m (including the bootstrap m).
@@ -166,7 +168,7 @@ func minit() {
        signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
-       nmask := _g_.m.sigmask
+       nmask := *(*uint32)(unsafe.Pointer(&_g_.m.sigmask))
        for i := range sigtable {
                if sigtable[i].flags&_SigUnblock != 0 {
                        nmask &^= 1 << (uint32(i) - 1)
@@ -178,7 +180,8 @@ func minit() {
 // Called from dropm to undo the effect of an minit.
 func unminit() {
        _g_ := getg()
-       sigprocmask(_SIG_SETMASK, _g_.m.sigmask)
+       smask := *(*uint32)(unsafe.Pointer(&_g_.m.sigmask))
+       sigprocmask(_SIG_SETMASK, smask)
        signalstack(nil)
 }
 
@@ -200,7 +203,7 @@ func setsig(i int32, fn uintptr, restart bool) {
        if restart {
                sa.sa_flags |= _SA_RESTART
        }
-       sa.sa_mask = uint32(sigset_all)
+       sa.sa_mask = sigset_all
        if fn == funcPC(sighandler) {
                fn = funcPC(sigtramp)
        }
@@ -234,10 +237,10 @@ func signalstack(s *stack) {
 }
 
 func updatesigmask(m sigmask) {
-       sigprocmask(_SIG_SETMASK, sigset(m[0]))
+       sigprocmask(_SIG_SETMASK, m[0])
 }
 
 func unblocksig(sig int32) {
-       mask := sigset(1) << (uint32(sig) - 1)
+       mask := uint32(1) << (uint32(sig) - 1)
        sigprocmask(_SIG_UNBLOCK, mask)
 }
index 06329da88e8a8cbad7cff57388bc5e0b7924352f..bc7ce65dafd18c02e59971c8a43360e69e4e3479 100644 (file)
@@ -9,8 +9,6 @@ import (
        "unsafe"
 )
 
-type sigset struct{}
-
 // Called to initialize a new m (including the bootstrap m).
 // Called on the parent thread (main thread in case of bootstrap), can allocate memory.
 func mpreinit(mp *m) {
index db1b8e4937cfee1837e02663219df2a58ac0f10e..813454357824e8537c221132cca8d952777bb2c9 100644 (file)
@@ -99,8 +99,6 @@ var (
        _GetQueuedCompletionStatusEx stdFunction
 )
 
-type sigset struct{}
-
 // Call a Windows function with stdcall conventions,
 // and switch to os stack during the call.
 func asmstdcall(fn unsafe.Pointer)
index c92722b7a2677e943b8681f47ac69bca8618d823..3ac121a7b828debe83d779c63a8d3c6b2649e061 100644 (file)
@@ -193,7 +193,11 @@ func mpreinit(mp *m) {
 func miniterrno()
 
 func msigsave(mp *m) {
-       sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
+       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)
 }
 
 // Called to initialize a new m (including the bootstrap m).
@@ -205,7 +209,7 @@ func minit() {
        signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
-       nmask := _g_.m.sigmask
+       nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
        for i := range sigtable {
                if sigtable[i].flags&_SigUnblock != 0 {
                        nmask.__sigbits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
@@ -217,7 +221,8 @@ func minit() {
 // Called from dropm to undo the effect of an minit.
 func unminit() {
        _g_ := getg()
-       sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil)
+       smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
+       sigprocmask(_SIG_SETMASK, smask, nil)
 
        signalstack(nil)
 }
index 75a6eebb70284651f9ed256cb1b3c6453ae1d912..7a70639b022f0627d9a494d14e8536a83a8711f3 100644 (file)
@@ -24,7 +24,7 @@ func mach_thread_self() uint32
 func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32
 
 //go:noescape
-func sigprocmask(how uint32, new, old *sigset)
+func sigprocmask(how uint32, new, old *uint32)
 
 //go:noescape
 func sigaction(mode uint32, new, old *sigactiont)
index b6285e49729d6af82fbb340047160a29d76577df..12f4cd1a246ed9dcda8af5ad3b437b85eb743e79 100644 (file)
@@ -18,7 +18,7 @@ func sigaction(sig int32, new, old *sigactiont)
 func sigaltstack(new, old *stackt)
 
 //go:noescape
-func sigprocmask(mode int32, new sigset) sigset
+func sigprocmask(mode int32, new uint32) uint32
 
 //go:noescape
 func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32
index 9e91832370124ffc9de9db71f45ea87fc22fcaa8..eb7b30a344d2c059bc350b078929baf9720427e5 100644 (file)
@@ -273,7 +273,7 @@ type m struct {
        // Fields not known to debuggers.
        procid        uint64     // for debuggers, but offset not hard-coded
        gsignal       *g         // signal-handling g
-       sigmask       sigset     // storage for saved signal mask
+       sigmask       [4]uintptr // storage for saved signal mask
        tls           [6]uintptr // thread-local storage (for x86 extern register)
        mstartfn      func()
        curg          *g       // current running goroutine