Skip to content

Commit 5af2be8

Browse files
committed
Revert "runtime: use a proper type, sigset, for m.sigmask"
This reverts commit 7db7727. Change-Id: I6d8855eb05ca331025dc49a5533c6da4d1fa4e84 Reviewed-on: https://go-review.googlesource.com/17030 Reviewed-by: Russ Cox <[email protected]>
1 parent 53c21df commit 5af2be8

13 files changed

+67
-45
lines changed

src/runtime/os1_darwin.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ import "unsafe"
88

99
//extern SigTabTT runtime·sigtab[];
1010

11-
type sigset uint32
12-
13-
var sigset_all = ^sigset(0)
11+
var sigset_all = ^uint32(0)
1412

1513
func unimplemented(name string) {
1614
println(name, "not implemented")
@@ -85,7 +83,7 @@ func newosproc(mp *m, stk unsafe.Pointer) {
8583
print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " id=", mp.id, " ostk=", &mp, "\n")
8684
}
8785

88-
var oset sigset
86+
var oset uint32
8987
sigprocmask(_SIG_SETMASK, &sigset_all, &oset)
9088
errno := bsdthread_create(stk, unsafe.Pointer(mp), funcPC(mstart))
9189
sigprocmask(_SIG_SETMASK, &oset, nil)
@@ -111,7 +109,7 @@ func newosproc0(stacksize uintptr, fn unsafe.Pointer, fnarg uintptr) {
111109
}
112110
stk := unsafe.Pointer(uintptr(stack) + stacksize)
113111

114-
var oset sigset
112+
var oset uint32
115113
sigprocmask(_SIG_SETMASK, &sigset_all, &oset)
116114
errno := bsdthread_create(stk, fn, fnarg)
117115
sigprocmask(_SIG_SETMASK, &oset, nil)
@@ -133,7 +131,11 @@ func mpreinit(mp *m) {
133131
}
134132

135133
func msigsave(mp *m) {
136-
sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
134+
smask := (*uint32)(unsafe.Pointer(&mp.sigmask))
135+
if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) {
136+
throw("insufficient storage for signal mask")
137+
}
138+
sigprocmask(_SIG_SETMASK, nil, smask)
137139
}
138140

139141
// Called to initialize a new m (including the bootstrap m).
@@ -144,7 +146,7 @@ func minit() {
144146
signalstack(&_g_.m.gsignal.stack)
145147

146148
// restore signal mask from m.sigmask and unblock essential signals
147-
nmask := _g_.m.sigmask
149+
nmask := *(*uint32)(unsafe.Pointer(&_g_.m.sigmask))
148150
for i := range sigtable {
149151
if sigtable[i].flags&_SigUnblock != 0 {
150152
nmask &^= 1 << (uint32(i) - 1)
@@ -156,7 +158,8 @@ func minit() {
156158
// Called from dropm to undo the effect of an minit.
157159
func unminit() {
158160
_g_ := getg()
159-
sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil)
161+
smask := (*uint32)(unsafe.Pointer(&_g_.m.sigmask))
162+
sigprocmask(_SIG_SETMASK, smask, nil)
160163
signalstack(nil)
161164
}
162165

@@ -469,11 +472,10 @@ func signalstack(s *stack) {
469472
}
470473

471474
func updatesigmask(m sigmask) {
472-
s := sigset(m[0])
473-
sigprocmask(_SIG_SETMASK, &s, nil)
475+
sigprocmask(_SIG_SETMASK, &m[0], nil)
474476
}
475477

476478
func unblocksig(sig int32) {
477-
mask := sigset(1) << (uint32(sig) - 1)
479+
mask := uint32(1) << (uint32(sig) - 1)
478480
sigprocmask(_SIG_UNBLOCK, &mask, nil)
479481
}

src/runtime/os1_dragonfly.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,11 @@ func mpreinit(mp *m) {
118118
}
119119

120120
func msigsave(mp *m) {
121-
sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
121+
smask := (*sigset)(unsafe.Pointer(&mp.sigmask))
122+
if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) {
123+
throw("insufficient storage for signal mask")
124+
}
125+
sigprocmask(_SIG_SETMASK, nil, smask)
122126
}
123127

124128
// Called to initialize a new m (including the bootstrap m).
@@ -133,7 +137,7 @@ func minit() {
133137
signalstack(&_g_.m.gsignal.stack)
134138

135139
// restore signal mask from m.sigmask and unblock essential signals
136-
nmask := _g_.m.sigmask
140+
nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
137141
for i := range sigtable {
138142
if sigtable[i].flags&_SigUnblock != 0 {
139143
nmask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
@@ -145,7 +149,8 @@ func minit() {
145149
// Called from dropm to undo the effect of an minit.
146150
func unminit() {
147151
_g_ := getg()
148-
sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil)
152+
smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
153+
sigprocmask(_SIG_SETMASK, smask, nil)
149154
signalstack(nil)
150155
}
151156

src/runtime/os1_freebsd.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,11 @@ func mpreinit(mp *m) {
121121
}
122122

123123
func msigsave(mp *m) {
124-
sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
124+
smask := (*sigset)(unsafe.Pointer(&mp.sigmask))
125+
if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) {
126+
throw("insufficient storage for signal mask")
127+
}
128+
sigprocmask(_SIG_SETMASK, nil, smask)
125129
}
126130

127131
// Called to initialize a new m (including the bootstrap m).
@@ -139,7 +143,7 @@ func minit() {
139143
signalstack(&_g_.m.gsignal.stack)
140144

141145
// restore signal mask from m.sigmask and unblock essential signals
142-
nmask := _g_.m.sigmask
146+
nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
143147
for i := range sigtable {
144148
if sigtable[i].flags&_SigUnblock != 0 {
145149
nmask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
@@ -151,7 +155,8 @@ func minit() {
151155
// Called from dropm to undo the effect of an minit.
152156
func unminit() {
153157
_g_ := getg()
154-
sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil)
158+
smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
159+
sigprocmask(_SIG_SETMASK, smask, nil)
155160
signalstack(nil)
156161
}
157162

src/runtime/os1_linux.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,10 @@ func mpreinit(mp *m) {
198198
}
199199

200200
func msigsave(mp *m) {
201-
smask := &mp.sigmask
201+
smask := (*sigset)(unsafe.Pointer(&mp.sigmask))
202+
if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) {
203+
throw("insufficient storage for signal mask")
204+
}
202205
rtsigprocmask(_SIG_SETMASK, nil, smask, int32(unsafe.Sizeof(*smask)))
203206
}
204207

@@ -215,7 +218,7 @@ func minit() {
215218
_g_.m.procid = uint64(gettid())
216219

217220
// restore signal mask from m.sigmask and unblock essential signals
218-
nmask := _g_.m.sigmask
221+
nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
219222
for i := range sigtable {
220223
if sigtable[i].flags&_SigUnblock != 0 {
221224
sigdelset(&nmask, i)
@@ -227,7 +230,7 @@ func minit() {
227230
// Called from dropm to undo the effect of an minit.
228231
func unminit() {
229232
_g_ := getg()
230-
smask := &_g_.m.sigmask
233+
smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
231234
rtsigprocmask(_SIG_SETMASK, smask, nil, int32(unsafe.Sizeof(*smask)))
232235
signalstack(nil)
233236
}

src/runtime/os1_nacl.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ package runtime
66

77
import "unsafe"
88

9-
type sigset struct{}
10-
119
// Called to initialize a new m (including the bootstrap m).
1210
// Called on the parent thread (main thread in case of bootstrap), can allocate memory.
1311
func mpreinit(mp *m) {

src/runtime/os1_netbsd.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,11 @@ func mpreinit(mp *m) {
139139
}
140140

141141
func msigsave(mp *m) {
142-
sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
142+
smask := (*sigset)(unsafe.Pointer(&mp.sigmask))
143+
if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) {
144+
throw("insufficient storage for signal mask")
145+
}
146+
sigprocmask(_SIG_SETMASK, nil, smask)
143147
}
144148

145149
// Called to initialize a new m (including the bootstrap m).
@@ -152,7 +156,7 @@ func minit() {
152156
signalstack(&_g_.m.gsignal.stack)
153157

154158
// restore signal mask from m.sigmask and unblock essential signals
155-
nmask := _g_.m.sigmask
159+
nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
156160
for i := range sigtable {
157161
if sigtable[i].flags&_SigUnblock != 0 {
158162
nmask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
@@ -164,7 +168,8 @@ func minit() {
164168
// Called from dropm to undo the effect of an minit.
165169
func unminit() {
166170
_g_ := getg()
167-
sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil)
171+
smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
172+
sigprocmask(_SIG_SETMASK, smask, nil)
168173

169174
signalstack(nil)
170175
}

src/runtime/os1_openbsd.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,9 @@ const (
2222
_CLOCK_MONOTONIC = 3
2323
)
2424

25-
type sigset uint32
26-
2725
const (
28-
sigset_none = sigset(0)
29-
sigset_all = ^sigset(0)
26+
sigset_none = uint32(0)
27+
sigset_all = ^uint32(0)
3028
)
3129

3230
// From OpenBSD's <sys/sysctl.h>
@@ -151,7 +149,11 @@ func mpreinit(mp *m) {
151149
}
152150

153151
func msigsave(mp *m) {
154-
mp.sigmask = sigprocmask(_SIG_BLOCK, 0)
152+
smask := (*uint32)(unsafe.Pointer(&mp.sigmask))
153+
if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) {
154+
throw("insufficient storage for signal mask")
155+
}
156+
*smask = sigprocmask(_SIG_BLOCK, 0)
155157
}
156158

157159
// Called to initialize a new m (including the bootstrap m).
@@ -166,7 +168,7 @@ func minit() {
166168
signalstack(&_g_.m.gsignal.stack)
167169

168170
// restore signal mask from m.sigmask and unblock essential signals
169-
nmask := _g_.m.sigmask
171+
nmask := *(*uint32)(unsafe.Pointer(&_g_.m.sigmask))
170172
for i := range sigtable {
171173
if sigtable[i].flags&_SigUnblock != 0 {
172174
nmask &^= 1 << (uint32(i) - 1)
@@ -178,7 +180,8 @@ func minit() {
178180
// Called from dropm to undo the effect of an minit.
179181
func unminit() {
180182
_g_ := getg()
181-
sigprocmask(_SIG_SETMASK, _g_.m.sigmask)
183+
smask := *(*uint32)(unsafe.Pointer(&_g_.m.sigmask))
184+
sigprocmask(_SIG_SETMASK, smask)
182185
signalstack(nil)
183186
}
184187

@@ -200,7 +203,7 @@ func setsig(i int32, fn uintptr, restart bool) {
200203
if restart {
201204
sa.sa_flags |= _SA_RESTART
202205
}
203-
sa.sa_mask = uint32(sigset_all)
206+
sa.sa_mask = sigset_all
204207
if fn == funcPC(sighandler) {
205208
fn = funcPC(sigtramp)
206209
}
@@ -234,10 +237,10 @@ func signalstack(s *stack) {
234237
}
235238

236239
func updatesigmask(m sigmask) {
237-
sigprocmask(_SIG_SETMASK, sigset(m[0]))
240+
sigprocmask(_SIG_SETMASK, m[0])
238241
}
239242

240243
func unblocksig(sig int32) {
241-
mask := sigset(1) << (uint32(sig) - 1)
244+
mask := uint32(1) << (uint32(sig) - 1)
242245
sigprocmask(_SIG_UNBLOCK, mask)
243246
}

src/runtime/os1_plan9.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import (
99
"unsafe"
1010
)
1111

12-
type sigset struct{}
13-
1412
// Called to initialize a new m (including the bootstrap m).
1513
// Called on the parent thread (main thread in case of bootstrap), can allocate memory.
1614
func mpreinit(mp *m) {

src/runtime/os1_windows.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,6 @@ var (
9999
_GetQueuedCompletionStatusEx stdFunction
100100
)
101101

102-
type sigset struct{}
103-
104102
// Call a Windows function with stdcall conventions,
105103
// and switch to os stack during the call.
106104
func asmstdcall(fn unsafe.Pointer)

src/runtime/os3_solaris.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,11 @@ func mpreinit(mp *m) {
193193
func miniterrno()
194194

195195
func msigsave(mp *m) {
196-
sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
196+
smask := (*sigset)(unsafe.Pointer(&mp.sigmask))
197+
if unsafe.Sizeof(*smask) > unsafe.Sizeof(mp.sigmask) {
198+
throw("insufficient storage for signal mask")
199+
}
200+
sigprocmask(_SIG_SETMASK, nil, smask)
197201
}
198202

199203
// Called to initialize a new m (including the bootstrap m).
@@ -205,7 +209,7 @@ func minit() {
205209
signalstack(&_g_.m.gsignal.stack)
206210

207211
// restore signal mask from m.sigmask and unblock essential signals
208-
nmask := _g_.m.sigmask
212+
nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
209213
for i := range sigtable {
210214
if sigtable[i].flags&_SigUnblock != 0 {
211215
nmask.__sigbits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
@@ -217,7 +221,8 @@ func minit() {
217221
// Called from dropm to undo the effect of an minit.
218222
func unminit() {
219223
_g_ := getg()
220-
sigprocmask(_SIG_SETMASK, &_g_.m.sigmask, nil)
224+
smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
225+
sigprocmask(_SIG_SETMASK, smask, nil)
221226

222227
signalstack(nil)
223228
}

src/runtime/os_darwin.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func mach_thread_self() uint32
2424
func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32
2525

2626
//go:noescape
27-
func sigprocmask(how uint32, new, old *sigset)
27+
func sigprocmask(how uint32, new, old *uint32)
2828

2929
//go:noescape
3030
func sigaction(mode uint32, new, old *sigactiont)

src/runtime/os_openbsd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func sigaction(sig int32, new, old *sigactiont)
1818
func sigaltstack(new, old *stackt)
1919

2020
//go:noescape
21-
func sigprocmask(mode int32, new sigset) sigset
21+
func sigprocmask(mode int32, new uint32) uint32
2222

2323
//go:noescape
2424
func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32

src/runtime/runtime2.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ type m struct {
273273
// Fields not known to debuggers.
274274
procid uint64 // for debuggers, but offset not hard-coded
275275
gsignal *g // signal-handling g
276-
sigmask sigset // storage for saved signal mask
276+
sigmask [4]uintptr // storage for saved signal mask
277277
tls [6]uintptr // thread-local storage (for x86 extern register)
278278
mstartfn func()
279279
curg *g // current running goroutine

0 commit comments

Comments
 (0)