Skip to content

Commit

Permalink
runtime: drop sigfwd from signal forwarding unsupported platforms
Browse files Browse the repository at this point in the history
This change splits signal_unix.go into signal_unix.go and
signal2_unix.go and removes the fake symbol sigfwd from signal
forwarding unsupported platforms for clarification purpose.

Change-Id: I205eab5cf1930fda8a68659b35cfa9f3a0e67ca6
Reviewed-on: https://go-review.googlesource.com/12062
Reviewed-by: Ian Lance Taylor <[email protected]>
  • Loading branch information
cixtor committed Oct 2, 2015
1 parent 02d2db1 commit 9fb7938
Show file tree
Hide file tree
Showing 11 changed files with 48 additions and 64 deletions.
3 changes: 0 additions & 3 deletions src/runtime/os_dragonfly.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@ func lwp_create(param *lwpparams) int32
//go:noescape
func sigaltstack(new, old *sigaltstackt)

//go:noescape
func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer)

//go:noescape
func sigaction(sig int32, new, old *sigactiont)

Expand Down
3 changes: 0 additions & 3 deletions src/runtime/os_freebsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@ func thr_new(param *thrparam, size int32)
//go:noescape
func sigaltstack(new, old *stackt)

//go:noescape
func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer)

//go:noescape
func sigaction(sig int32, new, old *sigactiont)

Expand Down
3 changes: 0 additions & 3 deletions src/runtime/os_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ func rt_sigaction(sig uintptr, new, old *sigactiont, size uintptr) int32
//go:noescape
func sigaltstack(new, old *sigaltstackt)

//go:noescape
func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer)

//go:noescape
func setitimer(mode int32, new, old *itimerval)

Expand Down
4 changes: 0 additions & 4 deletions src/runtime/os_nacl.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,6 @@ func sigpanic() {
panicmem()
}

func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer) {
throw("sigfwd not implemented")
}

func raiseproc(sig int32) {
}

Expand Down
4 changes: 0 additions & 4 deletions src/runtime/os_netbsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@ func sigaction(sig int32, new, old *sigactiont)
//go:noescape
func sigaltstack(new, old *sigaltstackt)

func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer) {
throw("sigfwd not implemented")
}

//go:noescape
func sigprocmask(mode int32, new, old *sigset)

Expand Down
5 changes: 0 additions & 5 deletions src/runtime/os_openbsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@

package runtime

import "unsafe"

//go:noescape
func setitimer(mode int32, new, old *itimerval)

Expand All @@ -15,9 +13,6 @@ func sigaction(sig int32, new, old *sigactiont)
//go:noescape
func sigaltstack(new, old *stackt)

//go:noescape
func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer)

//go:noescape
func sigprocmask(mode int32, new uint32) uint32

Expand Down
3 changes: 0 additions & 3 deletions src/runtime/os_solaris.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@ type libcFunc uintptr

var asmsysvicall6 libcFunc

//go:noescape
func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer)

//go:nosplit
func sysvicall0(fn *libcFunc) uintptr {
libcall := &getg().m.libcall
Expand Down
2 changes: 1 addition & 1 deletion src/runtime/signal1_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const (
// handle a particular signal (e.g., signal occurred on a non-Go thread).
// See sigfwdgo() for more information on when the signals are forwarded.
//
// Signal forwarding is currently available only on Linux.
// Signal forwarding is currently available only on Darwin and Linux.
var fwdSig [_NSIG]uintptr

// sigmask represents a general signal mask compatible with the GOOS
Expand Down
46 changes: 46 additions & 0 deletions src/runtime/signal2_unix.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build darwin linux

package runtime

import "unsafe"

//go:noescape
func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer)

// Determines if the signal should be handled by Go and if not, forwards the
// signal to the handler that was installed before Go's. Returns whether the
// signal was forwarded.
//go:nosplit
func sigfwdgo(sig uint32, info *siginfo, ctx unsafe.Pointer) bool {
g := getg()
c := &sigctxt{info, ctx}
if sig >= uint32(len(sigtable)) {
return false
}
fwdFn := fwdSig[sig]
flags := sigtable[sig].flags

// If there is no handler to forward to, no need to forward.
if fwdFn == _SIG_DFL {
return false
}
// Only forward synchronous signals.
if c.sigcode() == _SI_USER || flags&_SigPanic == 0 {
return false
}
// Determine if the signal occurred inside Go code. We test that:
// (1) we were in a goroutine (i.e., m.curg != nil), and
// (2) we weren't in CGO (i.e., m.curg.syscallsp == 0).
if g != nil && g.m != nil && g.m.curg != nil && g.m.curg.syscallsp == 0 {
return false
}
// Signal not handled by Go, forward it.
if fwdFn != _SIG_IGN {
sigfwd(fwdFn, sig, info, ctx)
}
return true
}
3 changes: 0 additions & 3 deletions src/runtime/signal_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,6 @@ var sigtable = [...]sigTabT{
/* 31 */ {_SigNotify, "SIGUSR2: user-defined signal 2"},
}

//go:noescape
func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer)

//go:noescape
func sigreturn(ctx unsafe.Pointer, infostyle uint32)

Expand Down
36 changes: 1 addition & 35 deletions src/runtime/signal_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,43 +6,9 @@

package runtime

import "unsafe"
import _ "unsafe" // for go:linkname

//go:linkname os_sigpipe os.sigpipe
func os_sigpipe() {
systemstack(sigpipe)
}

// Determines if the signal should be handled by Go and if not, forwards the
// signal to the handler that was installed before Go's. Returns whether the
// signal was forwarded.
//go:nosplit
func sigfwdgo(sig uint32, info *siginfo, ctx unsafe.Pointer) bool {
g := getg()
c := &sigctxt{info, ctx}
if sig >= uint32(len(sigtable)) {
return false
}
fwdFn := fwdSig[sig]
flags := sigtable[sig].flags

// If there is no handler to forward to, no need to forward.
if fwdFn == _SIG_DFL {
return false
}
// Only forward synchronous signals.
if c.sigcode() == _SI_USER || flags&_SigPanic == 0 {
return false
}
// Determine if the signal occurred inside Go code. We test that:
// (1) we were in a goroutine (i.e., m.curg != nil), and
// (2) we weren't in CGO (i.e., m.curg.syscallsp == 0).
if g != nil && g.m != nil && g.m.curg != nil && g.m.curg.syscallsp == 0 {
return false
}
// Signal not handled by Go, forward it.
if fwdFn != _SIG_IGN {
sigfwd(fwdFn, sig, info, ctx)
}
return true
}

0 comments on commit 9fb7938

Please sign in to comment.