aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/sys_darwin_amd64.s
diff options
context:
space:
mode:
authorNikhil Benesch <nikhil.benesch@gmail.com>2018-06-23 01:15:19 -0400
committerJosh Bleecher Snyder <josharian@gmail.com>2018-06-25 02:22:05 +0000
commit6fdbed0543cf8f4e21ab45938f5b04028877e861 (patch)
treec90fc20c61c1221caadec468a0510f65c5fd7a5b /src/runtime/sys_darwin_amd64.s
parent291e57f057c480889be3cc7abf83698f8c6646ba (diff)
downloadgo-6fdbed0543cf8f4e21ab45938f5b04028877e861.tar.gz
go-6fdbed0543cf8f4e21ab45938f5b04028877e861.zip
runtime: respect timeout in semasleep on Darwin
semasleep on Darwin was refactored in https://golang.org/cl/118736 to use the pthread_cond_timedwait function from libc. The new code incorrectly assumed that pthread_cond_timedwait took a timeout relative to the current time, when it in fact it takes a timeout specified in absolute time. semasleep thus specified a timeout well in the past, causing it to immediately exceed the timeout and spin hot. This was the source of a large performance hit to CockroachDB (#26019). Adjust semasleep to instead call pthread_cond_timedwait_relative_np, which properly interprets its timeout parameter as relative to the current time. pthread_cond_timedwait_relative_np is non-portable, but using pthread_cond_timedwait correctly would require two calls to gettimeofday: one in the runtime package to convert the relative timeout to absolute time, then another in the pthread library to convert back to a relative offset [0], as the Darwin kernel expects a relative offset. [0]: https://opensource.apple.com/source/libpthread/libpthread-301.30.1/src/pthread_cond.c.auto.html Fix #26019. Change-Id: I1a8c2429f79513b43d2b256365cd9166d235af8b Reviewed-on: https://go-review.googlesource.com/120635 Reviewed-by: Keith Randall <khr@golang.org> Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/sys_darwin_amd64.s')
-rw-r--r--src/runtime/sys_darwin_amd64.s4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/runtime/sys_darwin_amd64.s b/src/runtime/sys_darwin_amd64.s
index 5522a86a1f..142933585d 100644
--- a/src/runtime/sys_darwin_amd64.s
+++ b/src/runtime/sys_darwin_amd64.s
@@ -447,13 +447,13 @@ TEXT runtime·pthread_cond_wait_trampoline(SB),NOSPLIT,$0
POPQ BP
RET
-TEXT runtime·pthread_cond_timedwait_trampoline(SB),NOSPLIT,$0
+TEXT runtime·pthread_cond_timedwait_relative_np_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(SB)
+ CALL libc_pthread_cond_timedwait_relative_np(SB)
POPQ BP
RET