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_; }