Switch Semaphore to use dispatch_semaphore_t on Mac. The dispatch_semaphore_t is a higher-level, more-efficient semaphore primitive if the cross-process capabilities of semaphore_t are not needed. Bug: chromium:1012386 Change-Id: I9c1b50805ce7ec54f4848a2633b4a7b260e00578 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/6240 Reviewed-by: Scott Graham <scottmg@chromium.org> Commit-Queue: Scott Graham <scottmg@chromium.org>
diff --git a/util/semaphore.cc b/util/semaphore.cc index d5c82be..e13ec53 100644 --- a/util/semaphore.cc +++ b/util/semaphore.cc
@@ -12,28 +12,20 @@ #if defined(OS_MACOSX) Semaphore::Semaphore(int count) { - kern_return_t result = semaphore_create(mach_task_self(), &native_handle_, - SYNC_POLICY_FIFO, count); - DCHECK_EQ(KERN_SUCCESS, result); + native_handle_ = dispatch_semaphore_create(count); + DCHECK(native_handle_); } Semaphore::~Semaphore() { - kern_return_t result = semaphore_destroy(mach_task_self(), native_handle_); - DCHECK_EQ(KERN_SUCCESS, result); + dispatch_release(native_handle_); } void Semaphore::Signal() { - kern_return_t result = semaphore_signal(native_handle_); - DCHECK_EQ(KERN_SUCCESS, result); + dispatch_semaphore_signal(native_handle_); } void Semaphore::Wait() { - while (true) { - kern_return_t result = semaphore_wait(native_handle_); - if (result == KERN_SUCCESS) - return; // Semaphore was signalled. - DCHECK_EQ(KERN_ABORTED, result); - } + dispatch_semaphore_wait(native_handle_, DISPATCH_TIME_FOREVER); } #elif defined(OS_POSIX)
diff --git a/util/semaphore.h b/util/semaphore.h index 92a1df6..2952cae 100644 --- a/util/semaphore.h +++ b/util/semaphore.h
@@ -14,7 +14,7 @@ #if defined(OS_WIN) #include <windows.h> #elif defined(OS_MACOSX) -#include <mach/mach.h> +#include <dispatch/dispatch.h> #elif defined(OS_POSIX) #include <semaphore.h> #else @@ -34,11 +34,11 @@ void Wait(); #if defined(OS_MACOSX) - typedef semaphore_t NativeHandle; + using NativeHandle = dispatch_semaphore_t; #elif defined(OS_POSIX) - typedef sem_t NativeHandle; + using NativeHandle = sem_t; #elif defined(OS_WIN) - typedef HANDLE NativeHandle; + using NativeHandle = HANDLE; #endif NativeHandle& native_handle() { return native_handle_; }