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