| Index: mojo/edk/system/waiter.cc
|
| diff --git a/mojo/edk/system/waiter.cc b/mojo/edk/system/waiter.cc
|
| deleted file mode 100644
|
| index 6dcd713039e95c38681581e8694e9c8156a40101..0000000000000000000000000000000000000000
|
| --- a/mojo/edk/system/waiter.cc
|
| +++ /dev/null
|
| @@ -1,99 +0,0 @@
|
| -// Copyright 2013 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/waiter.h"
|
| -
|
| -#include <limits>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/time/time.h"
|
| -
|
| -namespace mojo {
|
| -namespace system {
|
| -
|
| -Waiter::Waiter()
|
| - : cv_(&lock_),
|
| -#ifndef NDEBUG
|
| - initialized_(false),
|
| -#endif
|
| - awoken_(false),
|
| - awake_result_(MOJO_RESULT_INTERNAL),
|
| - awake_context_(static_cast<uint32_t>(-1)) {
|
| -}
|
| -
|
| -Waiter::~Waiter() {
|
| -}
|
| -
|
| -void Waiter::Init() {
|
| -#ifndef NDEBUG
|
| - initialized_ = true;
|
| -#endif
|
| - awoken_ = false;
|
| - // NOTE(vtl): If performance ever becomes an issue, we can disable the setting
|
| - // of |awake_result_| (except the first one in |Awake()|) in Release builds.
|
| - awake_result_ = MOJO_RESULT_INTERNAL;
|
| -}
|
| -
|
| -// TODO(vtl): Fast-path the |deadline == 0| case?
|
| -MojoResult Waiter::Wait(MojoDeadline deadline, uint32_t* context) {
|
| - base::AutoLock locker(lock_);
|
| -
|
| -#ifndef NDEBUG
|
| - DCHECK(initialized_);
|
| - // It'll need to be re-initialized after this.
|
| - initialized_ = false;
|
| -#endif
|
| -
|
| - // Fast-path the already-awoken case:
|
| - if (awoken_) {
|
| - DCHECK_NE(awake_result_, MOJO_RESULT_INTERNAL);
|
| - if (context)
|
| - *context = awake_context_;
|
| - return awake_result_;
|
| - }
|
| -
|
| - // |MojoDeadline| is actually a |uint64_t|, but we need a signed quantity.
|
| - // Treat any out-of-range deadline as "forever" (which is wrong, but okay
|
| - // since 2^63 microseconds is ~300000 years). Note that this also takes care
|
| - // of the |MOJO_DEADLINE_INDEFINITE| (= 2^64 - 1) case.
|
| - if (deadline > static_cast<uint64_t>(std::numeric_limits<int64_t>::max())) {
|
| - do {
|
| - cv_.Wait();
|
| - } while (!awoken_);
|
| - } else {
|
| - // NOTE(vtl): This is very inefficient on POSIX, since pthreads condition
|
| - // variables take an absolute deadline.
|
| - const base::TimeTicks end_time =
|
| - base::TimeTicks::Now() +
|
| - base::TimeDelta::FromMicroseconds(static_cast<int64_t>(deadline));
|
| - do {
|
| - base::TimeTicks now_time = base::TimeTicks::Now();
|
| - if (now_time >= end_time)
|
| - return MOJO_RESULT_DEADLINE_EXCEEDED;
|
| -
|
| - cv_.TimedWait(end_time - now_time);
|
| - } while (!awoken_);
|
| - }
|
| -
|
| - DCHECK_NE(awake_result_, MOJO_RESULT_INTERNAL);
|
| - if (context)
|
| - *context = awake_context_;
|
| - return awake_result_;
|
| -}
|
| -
|
| -void Waiter::Awake(MojoResult result, uint32_t context) {
|
| - base::AutoLock locker(lock_);
|
| -
|
| - if (awoken_)
|
| - return;
|
| -
|
| - awoken_ = true;
|
| - awake_result_ = result;
|
| - awake_context_ = context;
|
| - cv_.Signal();
|
| - // |cv_.Wait()|/|cv_.TimedWait()| will return after |lock_| is released.
|
| -}
|
| -
|
| -} // namespace system
|
| -} // namespace mojo
|
|
|