aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/sys_darwin.go
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.go
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.go')
-rw-r--r--src/runtime/sys_darwin.go58
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