summaryrefslogtreecommitdiff
path: root/deps/v8/src/base/platform/semaphore.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/base/platform/semaphore.cc')
-rw-r--r--deps/v8/src/base/platform/semaphore.cc49
1 files changed, 9 insertions, 40 deletions
diff --git a/deps/v8/src/base/platform/semaphore.cc b/deps/v8/src/base/platform/semaphore.cc
index a7e50f5880..66464d8258 100644
--- a/deps/v8/src/base/platform/semaphore.cc
+++ b/deps/v8/src/base/platform/semaphore.cc
@@ -5,8 +5,7 @@
#include "src/base/platform/semaphore.h"
#if V8_OS_MACOSX
-#include <mach/mach_init.h>
-#include <mach/task.h>
+#include <dispatch/dispatch.h>
#endif
#include <errno.h>
@@ -21,53 +20,23 @@ namespace base {
#if V8_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);
- USE(result);
+ native_handle_ = dispatch_semaphore_create(count);
+ DCHECK(native_handle_);
}
+Semaphore::~Semaphore() { dispatch_release(native_handle_); }
-Semaphore::~Semaphore() {
- kern_return_t result = semaphore_destroy(mach_task_self(), native_handle_);
- DCHECK_EQ(KERN_SUCCESS, result);
- USE(result);
-}
-
-void Semaphore::Signal() {
- kern_return_t result = semaphore_signal(native_handle_);
- DCHECK_EQ(KERN_SUCCESS, result);
- USE(result);
-}
-
+void Semaphore::Signal() { 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);
}
bool Semaphore::WaitFor(const TimeDelta& rel_time) {
- TimeTicks now = TimeTicks::Now();
- TimeTicks end = now + rel_time;
- while (true) {
- mach_timespec_t ts;
- if (now >= end) {
- // Return immediately if semaphore was not signalled.
- ts.tv_sec = 0;
- ts.tv_nsec = 0;
- } else {
- ts = (end - now).ToMachTimespec();
- }
- kern_return_t result = semaphore_timedwait(native_handle_, ts);
- if (result == KERN_SUCCESS) return true; // Semaphore was signalled.
- if (result == KERN_OPERATION_TIMED_OUT) return false; // Timeout.
- DCHECK_EQ(KERN_ABORTED, result);
- now = TimeTicks::Now();
- }
+ dispatch_time_t timeout =
+ dispatch_time(DISPATCH_TIME_NOW, rel_time.InNanoseconds());
+ return dispatch_semaphore_wait(native_handle_, timeout) == 0;
}
#elif V8_OS_POSIX