diff options
author | Ian Lance Taylor <iant@golang.org> | 2019-06-13 12:49:03 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2019-06-15 05:36:45 +0000 |
commit | 85d56c3096636cebd6e0aea846d78599edbbb9e2 (patch) | |
tree | 2d2a80bd832c4f8b2da57d3eaab9bde96a2926bb /src/runtime/sys_darwin_amd64.s | |
parent | f18aeb3a54bf4490af68047e31d6cca8cb845297 (diff) | |
download | go-85d56c3096636cebd6e0aea846d78599edbbb9e2.tar.gz go-85d56c3096636cebd6e0aea846d78599edbbb9e2.zip |
runtime: use dispatch semaphores on Darwin
Changes Darwin semaphore support from using pthread mutexes and
condition variables to using dispatch semaphores. Signaling a dispatch
semaphore is async-signal-safe.
Fixes #31264
Change-Id: If0ce47623501db13e3804b14ace5f4d8eaef461e
Reviewed-on: https://go-review.googlesource.com/c/go/+/182258
Reviewed-by: Elias Naur <mail@eliasnaur.com>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/runtime/sys_darwin_amd64.s')
-rw-r--r-- | src/runtime/sys_darwin_amd64.s | 62 |
1 files changed, 21 insertions, 41 deletions
diff --git a/src/runtime/sys_darwin_amd64.s b/src/runtime/sys_darwin_amd64.s index bbe6bc14bf..95ba496cbc 100644 --- a/src/runtime/sys_darwin_amd64.s +++ b/src/runtime/sys_darwin_amd64.s @@ -482,64 +482,44 @@ TEXT runtime·raise_trampoline(SB),NOSPLIT,$0 POPQ BP RET -TEXT runtime·pthread_mutex_init_trampoline(SB),NOSPLIT,$0 +TEXT runtime·dispatch_semaphore_create_trampoline(SB),NOSPLIT,$0 PUSHQ BP MOVQ SP, BP - MOVQ 8(DI), SI // arg 2 attr - MOVQ 0(DI), DI // arg 1 mutex - CALL libc_pthread_mutex_init(SB) - POPQ BP - RET - -TEXT runtime·pthread_mutex_lock_trampoline(SB),NOSPLIT,$0 - PUSHQ BP - MOVQ SP, BP - MOVQ 0(DI), DI // arg 1 mutex - CALL libc_pthread_mutex_lock(SB) - POPQ BP - RET - -TEXT runtime·pthread_mutex_unlock_trampoline(SB),NOSPLIT,$0 - PUSHQ BP - MOVQ SP, BP - MOVQ 0(DI), DI // arg 1 mutex - CALL libc_pthread_mutex_unlock(SB) - POPQ BP - RET - -TEXT runtime·pthread_cond_init_trampoline(SB),NOSPLIT,$0 - PUSHQ BP - MOVQ SP, BP - MOVQ 8(DI), SI // arg 2 attr - MOVQ 0(DI), DI // arg 1 cond - CALL libc_pthread_cond_init(SB) + MOVQ DI, BX + MOVQ 0(BX), DI // arg 1 value + CALL libc_dispatch_semaphore_create(SB) + MOVQ AX, 8(BX) // result sema POPQ BP RET -TEXT runtime·pthread_cond_wait_trampoline(SB),NOSPLIT,$0 +TEXT runtime·dispatch_semaphore_wait_trampoline(SB),NOSPLIT,$0 PUSHQ BP MOVQ SP, BP - MOVQ 8(DI), SI // arg 2 mutex - MOVQ 0(DI), DI // arg 1 cond - CALL libc_pthread_cond_wait(SB) + MOVQ 8(DI), SI // arg 2 timeout + MOVQ 0(DI), DI // arg 1 sema + CALL libc_dispatch_semaphore_wait(SB) + TESTQ AX, AX // For safety convert 64-bit result to int32 0 or 1. + JEQ 2(PC) + MOVL $1, AX POPQ BP RET -TEXT runtime·pthread_cond_timedwait_relative_np_trampoline(SB),NOSPLIT,$0 +TEXT runtime·dispatch_semaphore_signal_trampoline(SB),NOSPLIT,$0 PUSHQ BP MOVQ SP, BP - MOVQ 8(DI), SI // arg 2 mutex - MOVQ 16(DI), DX // arg 3 timeout - MOVQ 0(DI), DI // arg 1 cond - CALL libc_pthread_cond_timedwait_relative_np(SB) + MOVQ 0(DI), DI // arg 1 sema + CALL libc_dispatch_semaphore_signal(SB) POPQ BP RET -TEXT runtime·pthread_cond_signal_trampoline(SB),NOSPLIT,$0 +TEXT runtime·dispatch_time_trampoline(SB),NOSPLIT,$0 PUSHQ BP MOVQ SP, BP - MOVQ 0(DI), DI // arg 1 cond - CALL libc_pthread_cond_signal(SB) + MOVQ DI, BX + MOVQ 0(BX), DI // arg 1 base + MOVQ 8(BX), SI // arg 2 delta + CALL libc_dispatch_time(SB) + MOVQ AX, 16(BX) POPQ BP RET |