diff options
Diffstat (limited to 'libgo/go/runtime/signal_gccgo.go')
-rw-r--r-- | libgo/go/runtime/signal_gccgo.go | 84 |
1 files changed, 32 insertions, 52 deletions
diff --git a/libgo/go/runtime/signal_gccgo.go b/libgo/go/runtime/signal_gccgo.go index 4e5044f26dd..62fe4588034 100644 --- a/libgo/go/runtime/signal_gccgo.go +++ b/libgo/go/runtime/signal_gccgo.go @@ -14,7 +14,7 @@ import ( // these are written in OS-specific files and in assembler. //extern sigaction -func sigaction(signum int32, act *_sigaction, oact *_sigaction) int32 +func sigaction(signum uint32, act *_sigaction, oact *_sigaction) int32 //extern sigprocmask func sigprocmask(how int32, set *sigset, oldset *sigset) int32 @@ -26,25 +26,35 @@ func sigfillset(set *sigset) int32 func sigemptyset(set *sigset) int32 //extern sigaddset -func sigaddset(set *sigset, signum int32) int32 +func c_sigaddset(set *sigset, signum uint32) int32 //extern sigdelset -func sigdelset(set *sigset, signum int32) int32 +func c_sigdelset(set *sigset, signum uint32) int32 //extern sigaltstack func sigaltstack(ss *_stack_t, oss *_stack_t) int32 //extern raise -func raise(sig int32) int32 +func raise(sig uint32) int32 //extern getpid func getpid() _pid_t //extern kill -func kill(pid _pid_t, sig int32) int32 +func kill(pid _pid_t, sig uint32) int32 + +//extern setitimer +func setitimer(which int32, new *_itimerval, old *_itimerval) int32 + +type siginfo _siginfo_t + +type sigTabT struct { + flags int32 + name string +} type sigctxt struct { - info *_siginfo_t + info *siginfo ctxt unsafe.Pointer } @@ -58,27 +68,10 @@ func (c *sigctxt) sigcode() uint64 { } //go:nosplit -func msigsave(mp *m) { - sigprocmask(_SIG_SETMASK, nil, &mp.sigmask) -} - -//go:nosplit -func msigrestore(sigmask sigset) { - sigprocmask(_SIG_SETMASK, &sigmask, nil) -} - -//go:nosplit -func sigblock() { - var set sigset - sigfillset(&set) - sigprocmask(_SIG_SETMASK, &set, nil) -} - -//go:nosplit //go:nowritebarrierrec -func setsig(i int32, fn uintptr, restart bool) { +func setsig(i uint32, fn uintptr) { var sa _sigaction - sa.sa_flags = _SA_SIGINFO + sa.sa_flags = _SA_SIGINFO | _SA_RESTART // For gccgo we do not set SA_ONSTACK for a signal that can // cause a panic. Instead, we trust that the split stack has @@ -89,9 +82,6 @@ func setsig(i int32, fn uintptr, restart bool) { sa.sa_flags |= _SA_ONSTACK } - if restart { - sa.sa_flags |= _SA_RESTART - } sigfillset((*sigset)(unsafe.Pointer(&sa.sa_mask))) setSigactionHandler(&sa, fn) sigaction(i, &sa, nil) @@ -99,7 +89,7 @@ func setsig(i int32, fn uintptr, restart bool) { //go:nosplit //go:nowritebarrierrec -func setsigstack(i int32) { +func setsigstack(i uint32) { var sa _sigaction sigaction(i, nil, &sa) handler := getSigactionHandler(&sa) @@ -115,7 +105,7 @@ func setsigstack(i int32) { //go:nosplit //go:nowritebarrierrec -func getsig(i int32) uintptr { +func getsig(i uint32) uintptr { var sa _sigaction if sigaction(i, nil, &sa) < 0 { // On GNU/Linux glibc rejects attempts to call @@ -132,34 +122,24 @@ func signalstack(p unsafe.Pointer, n uintptr) //go:nosplit //go:nowritebarrierrec -func updatesigmask(m sigmask) { - var mask sigset - sigemptyset(&mask) - for i := int32(0); i < _NSIG; i++ { - if m[(i-1)/32]&(1<<((uint(i)-1)&31)) != 0 { - sigaddset(&mask, i) - } - } - sigprocmask(_SIG_SETMASK, &mask, nil) -} - -func unblocksig(sig int32) { - var mask sigset - sigemptyset(&mask) - sigaddset(&mask, sig) - sigprocmask(_SIG_UNBLOCK, &mask, nil) +func raiseproc(sig uint32) { + kill(getpid(), sig) } //go:nosplit //go:nowritebarrierrec -func raiseproc(sig int32) { - kill(getpid(), sig) +func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer) { + f1 := &[1]uintptr{fn} + f2 := *(*func(uint32, *siginfo, unsafe.Pointer))(unsafe.Pointer(&f1)) + f2(sig, info, ctx) } //go:nosplit //go:nowritebarrierrec -func sigfwd(fn uintptr, sig uint32, info *_siginfo_t, ctx unsafe.Pointer) { - f1 := &[1]uintptr{fn} - f2 := *(*func(uint32, *_siginfo_t, unsafe.Pointer))(unsafe.Pointer(&f1)) - f2(sig, info, ctx) +func sigaddset(mask *sigset, i int) { + c_sigaddset(mask, uint32(i)) +} + +func sigdelset(mask *sigset, i int) { + c_sigdelset(mask, uint32(i)) } |