From 467e15accc95d4e080a8088eaff0aaa28f572c7e Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 21 May 2018 15:33:20 +0200 Subject: [PATCH] runtime: use raise instead of pthread_self and pthread_kill pthread_self and pthread_kill are not safe to call from a signal handler. In particular, pthread_self fails in iOS when called from a signal handler context. Use raise instead; it is signal handler safe and simpler. Change-Id: I0cbfe25151aed245f55d7b76719ce06dc78c6a75 Reviewed-on: https://go-review.googlesource.com/113877 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/runtime/os_darwin.go | 6 ------ src/runtime/sys_darwin.go | 9 ++++----- src/runtime/sys_darwin_386.s | 19 +++---------------- src/runtime/sys_darwin_amd64.s | 16 +++------------- 4 files changed, 10 insertions(+), 40 deletions(-) diff --git a/src/runtime/os_darwin.go b/src/runtime/os_darwin.go index 4df1fba17d..9a5a03a45d 100644 --- a/src/runtime/os_darwin.go +++ b/src/runtime/os_darwin.go @@ -539,12 +539,6 @@ func sigtramp(fn uintptr, infostyle, sig uint32, info *siginfo, ctx unsafe.Point //go:noescape func setitimer(mode int32, new, old *itimerval) -//go:nosplit -func raise(sig uint32) { - tid := pthread_self() - pthread_kill(tid, int(sig)) -} - func raiseproc(sig uint32) //extern SigTabTT runtime·sigtab[]; diff --git a/src/runtime/sys_darwin.go b/src/runtime/sys_darwin.go index 3bdd1f2b16..c2df8a6f1a 100644 --- a/src/runtime/sys_darwin.go +++ b/src/runtime/sys_darwin.go @@ -41,10 +41,10 @@ func pthread_create_trampoline() //go:nosplit //go:cgo_unsafe_args -func pthread_kill(thread pthread, sig int) (errno int32) { - return asmcgocall(unsafe.Pointer(funcPC(pthread_kill_trampoline)), unsafe.Pointer(&thread)) +func raise(sig uint32) { + asmcgocall(unsafe.Pointer(funcPC(raise_trampoline)), unsafe.Pointer(&sig)) } -func pthread_kill_trampoline() +func raise_trampoline() //go:nosplit //go:cgo_unsafe_args @@ -158,8 +158,7 @@ func exitThread(wait *uint32) { //go:cgo_import_dynamic libc_pthread_attr_setdetachstate pthread_attr_setdetachstate "/usr/lib/libSystem.B.dylib" //go:cgo_import_dynamic libc_pthread_create pthread_create "/usr/lib/libSystem.B.dylib" //go:cgo_import_dynamic libc_exit exit "/usr/lib/libSystem.B.dylib" -//go:cgo_import_dynamic libc_pthread_kill pthread_kill "/usr/lib/libSystem.B.dylib" -//go:cgo_import_dynamic libc_pthread_self pthread_self "/usr/lib/libSystem.B.dylib" +//go:cgo_import_dynamic libc_raise raise "/usr/lib/libSystem.B.dylib" //go:cgo_import_dynamic libc_open open "/usr/lib/libSystem.B.dylib" //go:cgo_import_dynamic libc_close close "/usr/lib/libSystem.B.dylib" diff --git a/src/runtime/sys_darwin_386.s b/src/runtime/sys_darwin_386.s index 44a686f400..dc2b84c484 100644 --- a/src/runtime/sys_darwin_386.s +++ b/src/runtime/sys_darwin_386.s @@ -619,27 +619,14 @@ TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0 POPL BP RET -TEXT runtime·pthread_self_trampoline(SB),NOSPLIT,$0 - PUSHL BP - MOVL SP, BP - SUBL $8, SP - CALL libc_pthread_self(SB) - MOVL 16(SP), CX - MOVL AX, (CX) // Save result. - MOVL BP, SP - POPL BP - RET - -TEXT runtime·pthread_kill_trampoline(SB),NOSPLIT,$0 +TEXT runtime·raise_trampoline(SB),NOSPLIT,$0 PUSHL BP MOVL SP, BP SUBL $8, SP MOVL 16(SP), CX - MOVL 0(CX), AX // arg 1 thread ID + MOVL 0(CX), AX // arg 1 sig MOVL AX, 0(SP) - MOVL 4(CX), AX // arg 2 sig - MOVL AX, 4(SP) - CALL libc_pthread_kill(SB) + CALL libc_raise(SB) MOVL BP, SP POPL BP RET diff --git a/src/runtime/sys_darwin_amd64.s b/src/runtime/sys_darwin_amd64.s index 24db7f52cd..8168415932 100644 --- a/src/runtime/sys_darwin_amd64.s +++ b/src/runtime/sys_darwin_amd64.s @@ -590,20 +590,10 @@ TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0 POPQ BP RET -TEXT runtime·pthread_self_trampoline(SB),NOSPLIT,$0 +TEXT runtime·raise_trampoline(SB),NOSPLIT,$0 PUSHQ BP MOVQ SP, BP - MOVQ DI, BX // Note: asmcgocall doesn't save anything in BX, so it is ok to clobber it here. - CALL libc_pthread_self(SB) - MOVQ AX, 0(BX) // Save result. - POPQ BP - RET - -TEXT runtime·pthread_kill_trampoline(SB),NOSPLIT,$0 - PUSHQ BP - MOVQ SP, BP - MOVQ 8(DI), SI // arg 2 signal - MOVQ 0(DI), DI // arg 1 thread - CALL libc_pthread_kill(SB) + MOVL 0(DI), DI // arg 1 signal + CALL libc_raise(SB) POPQ BP RET