Skip to content

Commit ab552aa

Browse files
runtime: unify some signal handling functions
Unify the OS-specific versions of msigsave, msigrestore, sigblock, updatesigmask, and unblocksig into single versions in signal_unix.go. To do this, make sigprocmask work the same way on all systems, which required adding a definition of sigprocmask for linux and openbsd. Also add a single OS-specific function sigmaskToSigset. Change-Id: I7cbf75131dddb57eeefe648ef845b0791404f785 Reviewed-on: https://go-review.googlesource.com/29689 Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: David Crawshaw <[email protected]>
1 parent fd29628 commit ab552aa

23 files changed

+134
-209
lines changed

src/runtime/os3_solaris.go

+4-25
Original file line numberDiff line numberDiff line change
@@ -204,21 +204,6 @@ func mpreinit(mp *m) {
204204

205205
func miniterrno()
206206

207-
//go:nosplit
208-
func msigsave(mp *m) {
209-
sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
210-
}
211-
212-
//go:nosplit
213-
func msigrestore(sigmask sigset) {
214-
sigprocmask(_SIG_SETMASK, &sigmask, nil)
215-
}
216-
217-
//go:nosplit
218-
func sigblock() {
219-
sigprocmask(_SIG_SETMASK, &sigset_all, nil)
220-
}
221-
222207
// Called to initialize a new m (including the bootstrap m).
223208
// Called on the new thread, cannot allocate memory.
224209
func minit() {
@@ -348,16 +333,10 @@ func signalstack(s *stack) {
348333

349334
//go:nosplit
350335
//go:nowritebarrierrec
351-
func updatesigmask(m sigmask) {
352-
var mask sigset
353-
copy(mask.__sigbits[:], m[:])
354-
sigprocmask(_SIG_SETMASK, &mask, nil)
355-
}
356-
357-
func unblocksig(sig int32) {
358-
var mask sigset
359-
mask.__sigbits[(sig-1)/32] |= 1 << ((uint32(sig) - 1) & 31)
360-
sigprocmask(_SIG_UNBLOCK, &mask, nil)
336+
func sigmaskToSigset(m sigmask) sigset {
337+
var set sigset
338+
copy(set.__sigbits[:], m[:])
339+
return set
361340
}
362341

363342
//go:nosplit

src/runtime/os_darwin.go

+3-24
Original file line numberDiff line numberDiff line change
@@ -173,21 +173,6 @@ func mpreinit(mp *m) {
173173
mp.gsignal.m = mp
174174
}
175175

176-
//go:nosplit
177-
func msigsave(mp *m) {
178-
sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
179-
}
180-
181-
//go:nosplit
182-
func msigrestore(sigmask sigset) {
183-
sigprocmask(_SIG_SETMASK, &sigmask, nil)
184-
}
185-
186-
//go:nosplit
187-
func sigblock() {
188-
sigprocmask(_SIG_SETMASK, &sigset_all, nil)
189-
}
190-
191176
// Called to initialize a new m (including the bootstrap m).
192177
// Called on the new thread, cannot allocate memory.
193178
func minit() {
@@ -515,7 +500,7 @@ const (
515500
)
516501

517502
//go:noescape
518-
func sigprocmask(how uint32, new, old *sigset)
503+
func sigprocmask(how int32, new, old *sigset)
519504

520505
//go:noescape
521506
func sigaction(mode uint32, new *sigactiont, old *usigactiont)
@@ -593,12 +578,6 @@ func signalstack(s *stack) {
593578

594579
//go:nosplit
595580
//go:nowritebarrierrec
596-
func updatesigmask(m sigmask) {
597-
s := sigset(m[0])
598-
sigprocmask(_SIG_SETMASK, &s, nil)
599-
}
600-
601-
func unblocksig(sig int32) {
602-
mask := sigset(1) << (uint32(sig) - 1)
603-
sigprocmask(_SIG_UNBLOCK, &mask, nil)
581+
func sigmaskToSigset(m sigmask) sigset {
582+
return sigset(m[0])
604583
}

src/runtime/os_dragonfly.go

+4-25
Original file line numberDiff line numberDiff line change
@@ -177,21 +177,6 @@ func mpreinit(mp *m) {
177177
mp.gsignal.m = mp
178178
}
179179

180-
//go:nosplit
181-
func msigsave(mp *m) {
182-
sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
183-
}
184-
185-
//go:nosplit
186-
func msigrestore(sigmask sigset) {
187-
sigprocmask(_SIG_SETMASK, &sigmask, nil)
188-
}
189-
190-
//go:nosplit
191-
func sigblock() {
192-
sigprocmask(_SIG_SETMASK, &sigset_all, nil)
193-
}
194-
195180
// Called to initialize a new m (including the bootstrap m).
196181
// Called on the new thread, cannot allocate memory.
197182
func minit() {
@@ -322,14 +307,8 @@ func signalstack(s *stack) {
322307

323308
//go:nosplit
324309
//go:nowritebarrierrec
325-
func updatesigmask(m sigmask) {
326-
var mask sigset
327-
copy(mask.__bits[:], m[:])
328-
sigprocmask(_SIG_SETMASK, &mask, nil)
329-
}
330-
331-
func unblocksig(sig int32) {
332-
var mask sigset
333-
mask.__bits[(sig-1)/32] |= 1 << ((uint32(sig) - 1) & 31)
334-
sigprocmask(_SIG_UNBLOCK, &mask, nil)
310+
func sigmaskToSigset(m sigmask) sigset {
311+
var set sigset
312+
copy(set.__bits[:], m[:])
313+
return set
335314
}

src/runtime/os_freebsd.go

+4-25
Original file line numberDiff line numberDiff line change
@@ -164,21 +164,6 @@ func mpreinit(mp *m) {
164164
mp.gsignal.m = mp
165165
}
166166

167-
//go:nosplit
168-
func msigsave(mp *m) {
169-
sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
170-
}
171-
172-
//go:nosplit
173-
func msigrestore(sigmask sigset) {
174-
sigprocmask(_SIG_SETMASK, &sigmask, nil)
175-
}
176-
177-
//go:nosplit
178-
func sigblock() {
179-
sigprocmask(_SIG_SETMASK, &sigset_all, nil)
180-
}
181-
182167
// Called to initialize a new m (including the bootstrap m).
183168
// Called on the new thread, cannot allocate memory.
184169
func minit() {
@@ -312,14 +297,8 @@ func signalstack(s *stack) {
312297

313298
//go:nosplit
314299
//go:nowritebarrierrec
315-
func updatesigmask(m [(_NSIG + 31) / 32]uint32) {
316-
var mask sigset
317-
copy(mask.__bits[:], m[:])
318-
sigprocmask(_SIG_SETMASK, &mask, nil)
319-
}
320-
321-
func unblocksig(sig int32) {
322-
var mask sigset
323-
mask.__bits[(sig-1)/32] |= 1 << ((uint32(sig) - 1) & 31)
324-
sigprocmask(_SIG_UNBLOCK, &mask, nil)
300+
func sigmaskToSigset(m sigmask) sigset {
301+
var set sigset
302+
copy(set.__bits[:], m[:])
303+
return set
325304
}

src/runtime/os_linux.go

+10-34
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,9 @@ func newosproc(mp *m, stk unsafe.Pointer) {
148148
// Disable signals during clone, so that the new thread starts
149149
// with signals disabled. It will enable them in minit.
150150
var oset sigset
151-
rtsigprocmask(_SIG_SETMASK, &sigset_all, &oset, int32(unsafe.Sizeof(oset)))
151+
sigprocmask(_SIG_SETMASK, &sigset_all, &oset)
152152
ret := clone(cloneFlags, stk, unsafe.Pointer(mp), unsafe.Pointer(mp.g0), unsafe.Pointer(funcPC(mstart)))
153-
rtsigprocmask(_SIG_SETMASK, &oset, nil, int32(unsafe.Sizeof(oset)))
153+
sigprocmask(_SIG_SETMASK, &oset, nil)
154154

155155
if ret < 0 {
156156
print("runtime: failed to create new OS thread (have ", mcount(), " already; errno=", -ret, ")\n")
@@ -252,22 +252,6 @@ func mpreinit(mp *m) {
252252
mp.gsignal.m = mp
253253
}
254254

255-
//go:nosplit
256-
func msigsave(mp *m) {
257-
smask := &mp.sigmask
258-
rtsigprocmask(_SIG_SETMASK, nil, smask, int32(unsafe.Sizeof(*smask)))
259-
}
260-
261-
//go:nosplit
262-
func msigrestore(sigmask sigset) {
263-
rtsigprocmask(_SIG_SETMASK, &sigmask, nil, int32(unsafe.Sizeof(sigmask)))
264-
}
265-
266-
//go:nosplit
267-
func sigblock() {
268-
rtsigprocmask(_SIG_SETMASK, &sigset_all, nil, int32(unsafe.Sizeof(sigset_all)))
269-
}
270-
271255
func gettid() uint32
272256

273257
// Called to initialize a new m (including the bootstrap m).
@@ -302,7 +286,7 @@ func minit() {
302286
sigdelset(&nmask, i)
303287
}
304288
}
305-
rtsigprocmask(_SIG_SETMASK, &nmask, nil, int32(unsafe.Sizeof(nmask)))
289+
sigprocmask(_SIG_SETMASK, &nmask, nil)
306290
}
307291

308292
// Called from dropm to undo the effect of an minit.
@@ -363,7 +347,13 @@ func sigaltstack(new, old *sigaltstackt)
363347
func setitimer(mode int32, new, old *itimerval)
364348

365349
//go:noescape
366-
func rtsigprocmask(sig uint32, new, old *sigset, size int32)
350+
func rtsigprocmask(how int32, new, old *sigset, size int32)
351+
352+
//go:nosplit
353+
//go:nowritebarrierrec
354+
func sigprocmask(how int32, new, old *sigset) {
355+
rtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))
356+
}
367357

368358
//go:noescape
369359
func getrlimit(kind int32, limit unsafe.Pointer) int32
@@ -441,17 +431,3 @@ func signalstack(s *stack) {
441431
}
442432
sigaltstack(&st, nil)
443433
}
444-
445-
//go:nosplit
446-
//go:nowritebarrierrec
447-
func updatesigmask(m sigmask) {
448-
var mask sigset
449-
sigcopyset(&mask, m)
450-
rtsigprocmask(_SIG_SETMASK, &mask, nil, int32(unsafe.Sizeof(mask)))
451-
}
452-
453-
func unblocksig(sig int32) {
454-
var mask sigset
455-
sigaddset(&mask, int(sig))
456-
rtsigprocmask(_SIG_UNBLOCK, &mask, nil, int32(unsafe.Sizeof(mask)))
457-
}

src/runtime/os_linux_generic.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ func sigfillset(mask *uint64) {
4343
*mask = ^uint64(0)
4444
}
4545

46-
func sigcopyset(mask *sigset, m sigmask) {
47-
copy((*mask)[:], m[:])
46+
//go:nosplit
47+
//go:nowritebarrierrec
48+
func sigmaskToSigset(m sigmask) sigset {
49+
var set sigset
50+
copy(set[:], m[:])
51+
return set
4852
}

src/runtime/os_linux_mips64x.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ func sigfillset(mask *[2]uint64) {
5959
(*mask)[0], (*mask)[1] = ^uint64(0), ^uint64(0)
6060
}
6161

62-
func sigcopyset(mask *sigset, m sigmask) {
63-
(*mask)[0] = uint64(m[0]) | uint64(m[1])<<32
62+
//go:nosplit
63+
//go:nowritebarrierrec
64+
func sigmaskToSigset(m sigmask) sigset {
65+
var set sigset
66+
set[0] = uint64(m[0]) | uint64(m[1])<<32
67+
return set
6468
}

src/runtime/os_linux_s390x.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ func sigfillset(mask *uint64) {
4141
*mask = ^uint64(0)
4242
}
4343

44-
func sigcopyset(mask *sigset, m sigmask) {
45-
*mask = sigset(uint64(m[0]) | uint64(m[1])<<32)
44+
//go:nosplit
45+
//go:nowritebarrierrec
46+
func sigmaskToSigset(m sigmask) sigset {
47+
return sigset(uint64(m[0]) | uint64(m[1])<<32)
4648
}

src/runtime/os_netbsd.go

+5-26
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func sigaction(sig int32, new, old *sigactiont)
3838
func sigaltstack(new, old *sigaltstackt)
3939

4040
//go:noescape
41-
func sigprocmask(mode int32, new, old *sigset)
41+
func sigprocmask(how int32, new, old *sigset)
4242

4343
//go:noescape
4444
func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32
@@ -222,21 +222,6 @@ func mpreinit(mp *m) {
222222
mp.gsignal.m = mp
223223
}
224224

225-
//go:nosplit
226-
func msigsave(mp *m) {
227-
sigprocmask(_SIG_SETMASK, nil, &mp.sigmask)
228-
}
229-
230-
//go:nosplit
231-
func msigrestore(sigmask sigset) {
232-
sigprocmask(_SIG_SETMASK, &sigmask, nil)
233-
}
234-
235-
//go:nosplit
236-
func sigblock() {
237-
sigprocmask(_SIG_SETMASK, &sigset_all, nil)
238-
}
239-
240225
// Called to initialize a new m (including the bootstrap m).
241226
// Called on the new thread, cannot allocate memory.
242227
func minit() {
@@ -333,14 +318,8 @@ func signalstack(s *stack) {
333318

334319
//go:nosplit
335320
//go:nowritebarrierrec
336-
func updatesigmask(m sigmask) {
337-
var mask sigset
338-
copy(mask.__bits[:], m[:])
339-
sigprocmask(_SIG_SETMASK, &mask, nil)
340-
}
341-
342-
func unblocksig(sig int32) {
343-
var mask sigset
344-
mask.__bits[(sig-1)/32] |= 1 << ((uint32(sig) - 1) & 31)
345-
sigprocmask(_SIG_UNBLOCK, &mask, nil)
321+
func sigmaskToSigset(m sigmask) sigset {
322+
var set sigset
323+
copy(set.__bits[:], m[:])
324+
return set
346325
}

0 commit comments

Comments
 (0)