aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/sys_darwin_amd64.s
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2019-06-13 12:49:03 -0700
committerIan Lance Taylor <iant@golang.org>2019-06-15 05:36:45 +0000
commit85d56c3096636cebd6e0aea846d78599edbbb9e2 (patch)
tree2d2a80bd832c4f8b2da57d3eaab9bde96a2926bb /src/runtime/sys_darwin_amd64.s
parentf18aeb3a54bf4490af68047e31d6cca8cb845297 (diff)
downloadgo-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.s62
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