5 #include "src/base/platform/semaphore.h" 8 #include <mach/mach_init.h> 14 #include "src/base/logging.h" 15 #include "src/base/platform/elapsed-timer.h" 16 #include "src/base/platform/time.h" 23 Semaphore::Semaphore(
int count) {
24 kern_return_t result = semaphore_create(
25 mach_task_self(), &native_handle_, SYNC_POLICY_FIFO, count);
26 DCHECK_EQ(KERN_SUCCESS, result);
31 Semaphore::~Semaphore() {
32 kern_return_t result = semaphore_destroy(mach_task_self(), native_handle_);
33 DCHECK_EQ(KERN_SUCCESS, result);
37 void Semaphore::Signal() {
38 kern_return_t result = semaphore_signal(native_handle_);
39 DCHECK_EQ(KERN_SUCCESS, result);
44 void Semaphore::Wait() {
46 kern_return_t result = semaphore_wait(native_handle_);
47 if (result == KERN_SUCCESS)
return;
48 DCHECK_EQ(KERN_ABORTED, result);
53 bool Semaphore::WaitFor(
const TimeDelta& rel_time) {
54 TimeTicks now = TimeTicks::Now();
55 TimeTicks end = now + rel_time;
63 ts = (end - now).ToMachTimespec();
65 kern_return_t result = semaphore_timedwait(native_handle_, ts);
66 if (result == KERN_SUCCESS)
return true;
67 if (result == KERN_OPERATION_TIMED_OUT)
return false;
68 DCHECK_EQ(KERN_ABORTED, result);
69 now = TimeTicks::Now();
75 Semaphore::Semaphore(
int count) {
77 int result = sem_init(&native_handle_, 0, count);
83 Semaphore::~Semaphore() {
84 int result = sem_destroy(&native_handle_);
89 void Semaphore::Signal() {
90 int result = sem_post(&native_handle_);
95 FATAL(
"Error when signaling semaphore, errno: %d", errno);
100 void Semaphore::Wait() {
102 int result = sem_wait(&native_handle_);
103 if (result == 0)
return;
105 DCHECK_EQ(-1, result);
106 DCHECK_EQ(EINTR, errno);
111 bool Semaphore::WaitFor(
const TimeDelta& rel_time) {
113 const Time time = Time::NowFromSystemTime() + rel_time;
114 const struct timespec ts = time.ToTimespec();
118 int result = sem_timedwait(&native_handle_, &ts);
119 if (result == 0)
return true;
120 #if V8_LIBC_GLIBC && !V8_GLIBC_PREREQ(2, 4) 127 if (result == -1 && errno == ETIMEDOUT) {
132 DCHECK_EQ(-1, result);
133 DCHECK_EQ(EINTR, errno);
139 Semaphore::Semaphore(
int count) {
141 native_handle_ = ::CreateSemaphoreA(
nullptr, count, 0x7FFFFFFF,
nullptr);
142 DCHECK_NOT_NULL(native_handle_);
146 Semaphore::~Semaphore() {
147 BOOL result = CloseHandle(native_handle_);
152 void Semaphore::Signal() {
154 BOOL result = ReleaseSemaphore(native_handle_, 1, &dummy);
160 void Semaphore::Wait() {
161 DWORD result = WaitForSingleObject(native_handle_, INFINITE);
162 DCHECK(result == WAIT_OBJECT_0);
167 bool Semaphore::WaitFor(
const TimeDelta& rel_time) {
168 TimeTicks now = TimeTicks::Now();
169 TimeTicks end = now + rel_time;
171 int64_t msec = (end - now).InMilliseconds();
172 if (msec >= static_cast<int64_t>(INFINITE)) {
173 DWORD result = WaitForSingleObject(native_handle_, INFINITE - 1);
174 if (result == WAIT_OBJECT_0) {
177 DCHECK(result == WAIT_TIMEOUT);
178 now = TimeTicks::Now();
180 DWORD result = WaitForSingleObject(
181 native_handle_, (msec < 0) ? 0 : static_cast<DWORD>(msec));
182 if (result == WAIT_TIMEOUT) {
185 DCHECK(result == WAIT_OBJECT_0);
191 #endif // V8_OS_MACOSX