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.go | |
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.go')
-rw-r--r-- | src/runtime/sys_darwin.go | 58 |
1 files changed, 18 insertions, 40 deletions
diff --git a/src/runtime/sys_darwin.go b/src/runtime/sys_darwin.go index b50d441d92..2aaa0f8546 100644 --- a/src/runtime/sys_darwin.go +++ b/src/runtime/sys_darwin.go @@ -339,52 +339,33 @@ func kevent_trampoline() //go:nosplit //go:cgo_unsafe_args -func pthread_mutex_init(m *pthreadmutex, attr *pthreadmutexattr) int32 { - return libcCall(unsafe.Pointer(funcPC(pthread_mutex_init_trampoline)), unsafe.Pointer(&m)) -} -func pthread_mutex_init_trampoline() - -//go:nosplit -//go:cgo_unsafe_args -func pthread_mutex_lock(m *pthreadmutex) int32 { - return libcCall(unsafe.Pointer(funcPC(pthread_mutex_lock_trampoline)), unsafe.Pointer(&m)) -} -func pthread_mutex_lock_trampoline() - -//go:nosplit -//go:cgo_unsafe_args -func pthread_mutex_unlock(m *pthreadmutex) int32 { - return libcCall(unsafe.Pointer(funcPC(pthread_mutex_unlock_trampoline)), unsafe.Pointer(&m)) -} -func pthread_mutex_unlock_trampoline() - -//go:nosplit -//go:cgo_unsafe_args -func pthread_cond_init(c *pthreadcond, attr *pthreadcondattr) int32 { - return libcCall(unsafe.Pointer(funcPC(pthread_cond_init_trampoline)), unsafe.Pointer(&c)) +func dispatch_semaphore_create(val int) (sema uintptr) { + libcCall(unsafe.Pointer(funcPC(dispatch_semaphore_create_trampoline)), unsafe.Pointer(&val)) + return } -func pthread_cond_init_trampoline() +func dispatch_semaphore_create_trampoline() //go:nosplit //go:cgo_unsafe_args -func pthread_cond_wait(c *pthreadcond, m *pthreadmutex) int32 { - return libcCall(unsafe.Pointer(funcPC(pthread_cond_wait_trampoline)), unsafe.Pointer(&c)) +func dispatch_semaphore_wait(sema uintptr, t uint64) int32 { + return libcCall(unsafe.Pointer(funcPC(dispatch_semaphore_wait_trampoline)), unsafe.Pointer(&sema)) } -func pthread_cond_wait_trampoline() +func dispatch_semaphore_wait_trampoline() //go:nosplit //go:cgo_unsafe_args -func pthread_cond_timedwait_relative_np(c *pthreadcond, m *pthreadmutex, t *timespec) int32 { - return libcCall(unsafe.Pointer(funcPC(pthread_cond_timedwait_relative_np_trampoline)), unsafe.Pointer(&c)) +func dispatch_semaphore_signal(sema uintptr) { + libcCall(unsafe.Pointer(funcPC(dispatch_semaphore_signal_trampoline)), unsafe.Pointer(&sema)) } -func pthread_cond_timedwait_relative_np_trampoline() +func dispatch_semaphore_signal_trampoline() //go:nosplit //go:cgo_unsafe_args -func pthread_cond_signal(c *pthreadcond) int32 { - return libcCall(unsafe.Pointer(funcPC(pthread_cond_signal_trampoline)), unsafe.Pointer(&c)) +func dispatch_time(base uint64, delta int64) (result uint64) { + libcCall(unsafe.Pointer(funcPC(dispatch_time_trampoline)), unsafe.Pointer(&base)) + return } -func pthread_cond_signal_trampoline() +func dispatch_time_trampoline() // Not used on Darwin, but must be defined. func exitThread(wait *uint32) { @@ -430,13 +411,10 @@ func closeonexec(fd int32) { //go:cgo_import_dynamic libc_kqueue kqueue "/usr/lib/libSystem.B.dylib" //go:cgo_import_dynamic libc_kevent kevent "/usr/lib/libSystem.B.dylib" -//go:cgo_import_dynamic libc_pthread_mutex_init pthread_mutex_init "/usr/lib/libSystem.B.dylib" -//go:cgo_import_dynamic libc_pthread_mutex_lock pthread_mutex_lock "/usr/lib/libSystem.B.dylib" -//go:cgo_import_dynamic libc_pthread_mutex_unlock pthread_mutex_unlock "/usr/lib/libSystem.B.dylib" -//go:cgo_import_dynamic libc_pthread_cond_init pthread_cond_init "/usr/lib/libSystem.B.dylib" -//go:cgo_import_dynamic libc_pthread_cond_wait pthread_cond_wait "/usr/lib/libSystem.B.dylib" -//go:cgo_import_dynamic libc_pthread_cond_timedwait_relative_np pthread_cond_timedwait_relative_np "/usr/lib/libSystem.B.dylib" -//go:cgo_import_dynamic libc_pthread_cond_signal pthread_cond_signal "/usr/lib/libSystem.B.dylib" +//go:cgo_import_dynamic libc_dispatch_semaphore_create dispatch_semaphore_create "/usr/lib/libSystem.B.dylib" +//go:cgo_import_dynamic libc_dispatch_semaphore_wait dispatch_semaphore_wait "/usr/lib/libSystem.B.dylib" +//go:cgo_import_dynamic libc_dispatch_semaphore_signal dispatch_semaphore_signal "/usr/lib/libSystem.B.dylib" +//go:cgo_import_dynamic libc_dispatch_time dispatch_time "/usr/lib/libSystem.B.dylib" // Magic incantation to get libSystem actually dynamically linked. // TODO: Why does the code require this? See cmd/link/internal/ld/go.go |