5 #include "src/base/platform/condition-variable.h" 10 #include "src/base/platform/time.h" 17 ConditionVariable::ConditionVariable() {
18 #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \ 19 (V8_OS_LINUX && V8_LIBC_GLIBC)) 22 pthread_condattr_t attr;
23 int result = pthread_condattr_init(&attr);
25 result = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
27 result = pthread_cond_init(&native_handle_, &attr);
29 result = pthread_condattr_destroy(&attr);
31 int result = pthread_cond_init(&native_handle_,
nullptr);
38 ConditionVariable::~ConditionVariable() {
39 #if defined(V8_OS_MACOSX) 48 pthread_cond_timedwait_relative_np(&native_handle_, &lock.native_handle(),
52 int result = pthread_cond_destroy(&native_handle_);
58 void ConditionVariable::NotifyOne() {
59 int result = pthread_cond_signal(&native_handle_);
65 void ConditionVariable::NotifyAll() {
66 int result = pthread_cond_broadcast(&native_handle_);
72 void ConditionVariable::Wait(Mutex* mutex) {
73 mutex->AssertHeldAndUnmark();
74 int result = pthread_cond_wait(&native_handle_, &mutex->native_handle());
77 mutex->AssertUnheldAndMark();
81 bool ConditionVariable::WaitFor(Mutex* mutex,
const TimeDelta& rel_time) {
84 mutex->AssertHeldAndUnmark();
88 ts = rel_time.ToTimespec();
89 DCHECK_GE(ts.tv_sec, 0);
90 DCHECK_GE(ts.tv_nsec, 0);
91 result = pthread_cond_timedwait_relative_np(
92 &native_handle_, &mutex->native_handle(), &ts);
94 #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \ 95 (V8_OS_LINUX && V8_LIBC_GLIBC)) 98 result = clock_gettime(CLOCK_MONOTONIC, &ts);
100 Time now = Time::FromTimespec(ts);
103 Time now = Time::NowFromSystemTime();
105 Time end_time = now + rel_time;
106 DCHECK_GE(end_time, now);
107 ts = end_time.ToTimespec();
108 result = pthread_cond_timedwait(
109 &native_handle_, &mutex->native_handle(), &ts);
110 #endif // V8_OS_MACOSX 111 mutex->AssertUnheldAndMark();
112 if (result == ETIMEDOUT) {
115 DCHECK_EQ(0, result);
121 ConditionVariable::ConditionVariable() {
122 InitializeConditionVariable(&native_handle_);
126 ConditionVariable::~ConditionVariable() {}
128 void ConditionVariable::NotifyOne() { WakeConditionVariable(&native_handle_); }
130 void ConditionVariable::NotifyAll() {
131 WakeAllConditionVariable(&native_handle_);
135 void ConditionVariable::Wait(Mutex* mutex) {
136 mutex->AssertHeldAndUnmark();
137 SleepConditionVariableSRW(&native_handle_, &mutex->native_handle(), INFINITE,
139 mutex->AssertUnheldAndMark();
143 bool ConditionVariable::WaitFor(Mutex* mutex,
const TimeDelta& rel_time) {
144 int64_t msec = rel_time.InMilliseconds();
145 mutex->AssertHeldAndUnmark();
146 BOOL result = SleepConditionVariableSRW(
147 &native_handle_, &mutex->native_handle(),
static_cast<DWORD
>(msec), 0);
155 DCHECK_EQ(static_cast<DWORD>(ERROR_TIMEOUT), GetLastError());
158 mutex->AssertUnheldAndMark();
162 #endif // V8_OS_POSIX