diff options
| author | Ian Lance Taylor <iant@golang.org> | 2015-12-16 12:16:17 -0800 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2015-12-18 22:27:38 +0000 |
| commit | fbdfa99246ecbb04954a042a5809c4748415574d (patch) | |
| tree | 5348546989d1f40d7c9b4e2a8a400fc6591545fb /src/runtime | |
| parent | 32cf985d1a74b2d5f0f79835f0c1be5c44db77ff (diff) | |
| download | go-fbdfa99246ecbb04954a042a5809c4748415574d.tar.xz | |
runtime: for c-archive/c-shared, don't install unnecessary signal handlers
Only install signal handlers for synchronous signals that become
run-time panics. Set the SA_ONSTACK flag for other signal handlers as
needed.
Fixes #13028.
Update #12465.
Update #13034.
Update #13042.
Change-Id: I28375e70641f60630e10f3c86e24b6e4f8a35cc9
Reviewed-on: https://go-review.googlesource.com/17903
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime')
| -rw-r--r-- | src/runtime/signal1_unix.go | 8 | ||||
| -rw-r--r-- | src/runtime/signal2_unix.go | 11 | ||||
| -rw-r--r-- | src/runtime/sys_darwin_amd64.s | 6 | ||||
| -rw-r--r-- | src/runtime/sys_linux_arm.s | 4 |
4 files changed, 26 insertions, 3 deletions
diff --git a/src/runtime/signal1_unix.go b/src/runtime/signal1_unix.go index 405713b371..2a325bb9fc 100644 --- a/src/runtime/signal1_unix.go +++ b/src/runtime/signal1_unix.go @@ -65,6 +65,14 @@ func initsig() { continue } + // When built using c-archive or c-shared, only + // install signal handlers for synchronous signals. + // Set SA_ONSTACK for other signals if necessary. + if (isarchive || islibrary) && t.flags&_SigPanic == 0 { + setsigstack(i) + continue + } + t.flags |= _SigHandling setsig(i, funcPC(sighandler), true) } diff --git a/src/runtime/signal2_unix.go b/src/runtime/signal2_unix.go index 8b0bd42206..0633a51900 100644 --- a/src/runtime/signal2_unix.go +++ b/src/runtime/signal2_unix.go @@ -16,8 +16,6 @@ func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer) // 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 } @@ -28,13 +26,22 @@ func sigfwdgo(sig uint32, info *siginfo, ctx unsafe.Pointer) bool { if fwdFn == _SIG_DFL { return false } + + // If we aren't handling the signal, forward it. + if flags&_SigHandling == 0 { + sigfwd(fwdFn, sig, info, ctx) + return true + } + // Only forward synchronous signals. + c := &sigctxt{info, ctx} 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). + g := getg() if g != nil && g.m != nil && g.m.curg != nil && g.m.curg.syscallsp == 0 { return false } diff --git a/src/runtime/sys_darwin_amd64.s b/src/runtime/sys_darwin_amd64.s index 692dbca580..7b9cf6a3bc 100644 --- a/src/runtime/sys_darwin_amd64.s +++ b/src/runtime/sys_darwin_amd64.s @@ -214,10 +214,14 @@ TEXT runtime·sigaction(SB),NOSPLIT,$0-24 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 MOVQ fn+0(FP), AX - MOVQ sig+8(FP), DI + MOVL sig+8(FP), DI MOVQ info+16(FP), SI MOVQ ctx+24(FP), DX + MOVQ SP, BP + SUBQ $64, SP + ANDQ $~15, SP // alignment for x86_64 ABI CALL AX + MOVQ BP, SP RET TEXT runtime·sigreturn(SB),NOSPLIT,$0-12 diff --git a/src/runtime/sys_linux_arm.s b/src/runtime/sys_linux_arm.s index 216781ef7a..6a3b924330 100644 --- a/src/runtime/sys_linux_arm.s +++ b/src/runtime/sys_linux_arm.s @@ -339,7 +339,11 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-16 MOVW info+8(FP), R1 MOVW ctx+12(FP), R2 MOVW fn+0(FP), R11 + MOVW R13, R4 + SUB $24, R13 + BIC $0x7, R13 // alignment for ELF ABI BL (R11) + MOVW R4, R13 RET TEXT runtime·sigtramp(SB),NOSPLIT,$12 |
