Index: mojo/edk/system/cond_var.cc |
diff --git a/mojo/edk/system/cond_var.cc b/mojo/edk/system/cond_var.cc |
deleted file mode 100644 |
index a80f83a9f760c212cf8418fe053e538402e1d5d9..0000000000000000000000000000000000000000 |
--- a/mojo/edk/system/cond_var.cc |
+++ /dev/null |
@@ -1,147 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "mojo/edk/system/cond_var.h" |
- |
-#include <errno.h> |
-#include <string.h> |
-#include <time.h> |
- |
-#include <limits> |
- |
-#include "base/logging.h" |
-#include "build/build_config.h" |
-#include "mojo/edk/system/mutex.h" |
- |
-namespace mojo { |
-namespace system { |
- |
-namespace { |
- |
-// Helper for |CondVar::WaitWithTimeout()|. Returns true on (definite) time-out. |
-bool RelativeTimedWait(const struct timespec& timeout_rel, |
- pthread_cond_t* posix_cond_var, |
- pthread_mutex_t* posix_mutex) { |
-// Mac has a function to do a relative timed wait directly. |
-#if defined(OS_MACOSX) |
- int error = pthread_cond_timedwait_relative_np(posix_cond_var, posix_mutex, |
- &timeout_rel); |
- DCHECK(error == 0 || error == ETIMEDOUT || error == EINTR) |
- << ". pthread_cond_timedwait_relative_np: " << strerror(error); |
- return error == ETIMEDOUT; |
-#else |
- static const long kNanosecondsPerSecond = 1000000000L; |
- |
-// NaCl's |pthread_condattr_setclock()| only supports |CLOCK_REALTIME| (which is |
-// the default, which is why we don't bother setting it in |CondVar|'s |
-// constructor). |
-#if defined(OS_NACL) |
- static const clockid_t kClockType = CLOCK_REALTIME; |
-#else |
- static const clockid_t kClockType = CLOCK_MONOTONIC; |
-#endif // defined(OS_NACL) |
- |
- struct timespec timeout_abs; |
- int error = clock_gettime(kClockType, &timeout_abs); |
- // Note: The return value of |clock_gettime()| is *not* an error code, unlike |
- // the pthreads functions. |
- DPCHECK(!error) << "clock_gettime"; |
- |
- timeout_abs.tv_sec += timeout_rel.tv_sec; |
- timeout_abs.tv_nsec += timeout_rel.tv_nsec; |
- if (timeout_abs.tv_nsec >= kNanosecondsPerSecond) { |
- timeout_abs.tv_sec++; |
- timeout_abs.tv_nsec -= kNanosecondsPerSecond; |
- DCHECK_LT(timeout_abs.tv_nsec, kNanosecondsPerSecond); |
- } |
- |
-// Older Android doesn't have |pthread_condattr_setclock()|, but they have |
-// |pthread_cond_timedwait_monotonic_np()|. |
-#if defined(OS_ANDROID) && defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC) |
- error = pthread_cond_timedwait_monotonic_np(posix_cond_var, posix_mutex, |
- &timeout_abs); |
- DCHECK(error == 0 || error == ETIMEDOUT || error == EINTR) |
- << ". pthread_cond_timedwait_monotonic_np: " << strerror(error); |
-#else |
- error = pthread_cond_timedwait(posix_cond_var, posix_mutex, &timeout_abs); |
- DCHECK(error == 0 || error == ETIMEDOUT || error == EINTR) |
- << ". pthread_cond_timedwait: " << strerror(error); |
-#endif // defined(OS_ANDROID) && defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC) |
- return error == ETIMEDOUT; |
-#endif // defined(OS_MACOSX) |
-} |
- |
-} // namespace |
- |
-CondVar::CondVar() { |
-// Mac and older Android don't have |pthread_condattr_setclock()| (but they have |
-// other timed wait functions we can use) and NaCl doesn't have a useful one. |
-#if !defined(OS_MACOSX) && !defined(OS_NACL) && \ |
- !(defined(OS_ANDROID) && defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC)) |
- pthread_condattr_t attr; |
- int error = pthread_condattr_init(&attr); |
- DCHECK(!error) << "pthread_condattr_init: " << strerror(error); |
- error = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); |
- DCHECK(!error) << "pthread_condattr_setclock: " << strerror(error); |
- error = pthread_cond_init(&impl_, &attr); |
- DCHECK(!error) << "pthread_cond_init: " << strerror(error); |
- error = pthread_condattr_destroy(&attr); |
- DCHECK(!error) << "pthread_condattr_destroy: " << strerror(error); |
-#else |
- int error = pthread_cond_init(&impl_, nullptr); |
- DCHECK(!error) << "pthread_cond_init: " << strerror(error); |
-#endif // !defined(OS_MACOSX) && !defined(OS_NACL) && !(defined(OS_ANDROID)...) |
-} |
- |
-CondVar::~CondVar() { |
- int error = pthread_cond_destroy(&impl_); |
- DCHECK(!error) << "pthread_cond_destroy: " << strerror(error); |
-} |
- |
-void CondVar::Wait(Mutex* mutex) { |
- DCHECK(mutex); |
- mutex->AssertHeld(); |
- |
- int error = pthread_cond_wait(&impl_, &mutex->impl_); |
- DCHECK(!error) << "pthread_cond_wait: " << strerror(error); |
-} |
- |
-bool CondVar::WaitWithTimeout(Mutex* mutex, uint64_t timeout_microseconds) { |
- static const uint64_t kMicrosecondsPerSecond = 1000000ULL; |
- static const uint64_t kNanosecondsPerMicrosecond = 1000ULL; |
- |
- // Turn very long waits into "forever". This isn't a huge concern if |time_t| |
- // is 64-bit, but overflowing |time_t| is a real risk if it's only 32-bit. |
- // (2^31 / 16 seconds = ~4.25 years, so we won't risk overflowing until 2033.) |
- constexpr uint64_t kForeverThresholdSeconds = |
- std::numeric_limits<time_t>::max() / 16; |
- uint64_t timeout_seconds = timeout_microseconds / kMicrosecondsPerSecond; |
- if (timeout_seconds >= kForeverThresholdSeconds) { |
- Wait(mutex); |
- return false; // Did *not* time out. |
- } |
- |
- DCHECK(mutex); |
- mutex->AssertHeld(); |
- |
- struct timespec timeout_rel = {}; |
- timeout_rel.tv_sec = static_cast<time_t>(timeout_seconds); |
- timeout_rel.tv_nsec = |
- static_cast<long>((timeout_microseconds % kMicrosecondsPerSecond) * |
- kNanosecondsPerMicrosecond); |
- return RelativeTimedWait(timeout_rel, &impl_, &mutex->impl_); |
-} |
- |
-void CondVar::Signal() { |
- int error = pthread_cond_signal(&impl_); |
- DCHECK(!error) << "pthread_cond_signal: " << strerror(error); |
-} |
- |
-void CondVar::SignalAll() { |
- int error = pthread_cond_broadcast(&impl_); |
- DCHECK(!error) << "pthread_cond_broadcast: " << strerror(error); |
-} |
- |
-} // namespace system |
-} // namespace mojo |