ipc/chromium/src/base/waitable_event_win.cc

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
     2 // Use of this source code is governed by a BSD-style license that can be
     3 // found in the LICENSE file.
     5 #include "base/waitable_event.h"
     7 #include <math.h>
     8 #include <windows.h>
    10 #include "base/logging.h"
    11 #include "base/time.h"
    13 namespace base {
    15 WaitableEvent::WaitableEvent(bool manual_reset, bool signaled)
    16     : handle_(CreateEvent(NULL, manual_reset, signaled, NULL)) {
    17   // We're probably going to crash anyways if this is ever NULL, so we might as
    18   // well make our stack reports more informative by crashing here.
    19   CHECK(handle_);
    20 }
    22 WaitableEvent::WaitableEvent(HANDLE handle)
    23     : handle_(handle) {
    24   CHECK(handle) << "Tried to create WaitableEvent from NULL handle";
    25 }
    27 WaitableEvent::~WaitableEvent() {
    28   CloseHandle(handle_);
    29 }
    31 HANDLE WaitableEvent::Release() {
    32   HANDLE rv = handle_;
    33   handle_ = INVALID_HANDLE_VALUE;
    34   return rv;
    35 }
    37 void WaitableEvent::Reset() {
    38   ResetEvent(handle_);
    39 }
    41 void WaitableEvent::Signal() {
    42   SetEvent(handle_);
    43 }
    45 bool WaitableEvent::IsSignaled() {
    46   return TimedWait(TimeDelta::FromMilliseconds(0));
    47 }
    49 bool WaitableEvent::Wait() {
    50   DWORD result = WaitForSingleObject(handle_, INFINITE);
    51   // It is most unexpected that this should ever fail.  Help consumers learn
    52   // about it if it should ever fail.
    53   DCHECK(result == WAIT_OBJECT_0) << "WaitForSingleObject failed";
    54   return result == WAIT_OBJECT_0;
    55 }
    57 bool WaitableEvent::TimedWait(const TimeDelta& max_time) {
    58   DCHECK(max_time >= TimeDelta::FromMicroseconds(0));
    59   // Be careful here.  TimeDelta has a precision of microseconds, but this API
    60   // is in milliseconds.  If there are 5.5ms left, should the delay be 5 or 6?
    61   // It should be 6 to avoid returning too early.
    62   double timeout = ceil(max_time.InMillisecondsF());
    63   DWORD result = WaitForSingleObject(handle_, static_cast<DWORD>(timeout));
    64   switch (result) {
    65     case WAIT_OBJECT_0:
    66       return true;
    67     case WAIT_TIMEOUT:
    68       return false;
    69   }
    70   // It is most unexpected that this should ever fail.  Help consumers learn
    71   // about it if it should ever fail.
    72   NOTREACHED() << "WaitForSingleObject failed";
    73   return false;
    74 }
    76 // static
    77 size_t WaitableEvent::WaitMany(WaitableEvent** events, size_t count) {
    78   HANDLE handles[MAXIMUM_WAIT_OBJECTS];
    79   CHECK(count <= MAXIMUM_WAIT_OBJECTS)
    80       << "Can only wait on " << MAXIMUM_WAIT_OBJECTS << " with WaitMany";
    82   for (size_t i = 0; i < count; ++i)
    83     handles[i] = events[i]->handle();
    85   DWORD result =
    86       WaitForMultipleObjects(count, handles,
    87                              FALSE,      // don't wait for all the objects
    88                              INFINITE);  // no timeout
    89   if (result < WAIT_OBJECT_0 || result >= WAIT_OBJECT_0 + count) {
    90     NOTREACHED() << "WaitForMultipleObjects failed: " << GetLastError();
    91     return 0;
    92   }
    94   return result - WAIT_OBJECT_0;
    95 }
    97 }  // namespace base

mercurial