Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1261)

Unified Diff: mojo/edk/system/cond_var.cc

Issue 1426343002: EDK: Move mutex.*, cond_var.*, and thread_annotations.h to //mojo/edk/util. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: oops Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/edk/system/cond_var.h ('k') | mojo/edk/system/cond_var_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « mojo/edk/system/cond_var.h ('k') | mojo/edk/system/cond_var_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698