| Index: base/waitable_event_win.cc
|
| diff --git a/base/waitable_event_win.cc b/base/waitable_event_win.cc
|
| index 257f14556539aafe0e919902504824f74f1c1e6c..001a5dfca42ec2902264fd685e9696d70f8e68a7 100644
|
| --- a/base/waitable_event_win.cc
|
| +++ b/base/waitable_event_win.cc
|
| @@ -13,22 +13,27 @@
|
| namespace base {
|
|
|
| WaitableEvent::WaitableEvent(bool manual_reset, bool signaled)
|
| - : event_(CreateEvent(NULL, manual_reset, signaled, NULL)) {
|
| + : handle_(CreateEvent(NULL, manual_reset, signaled, NULL)) {
|
| // We're probably going to crash anyways if this is ever NULL, so we might as
|
| // well make our stack reports more informative by crashing here.
|
| - CHECK(event_);
|
| + CHECK(handle_);
|
| +}
|
| +
|
| +WaitableEvent::WaitableEvent(HANDLE handle)
|
| + : handle_(handle) {
|
| + CHECK(handle) << "Tried to create WaitableEvent from NULL handle";
|
| }
|
|
|
| WaitableEvent::~WaitableEvent() {
|
| - CloseHandle(event_);
|
| + CloseHandle(handle_);
|
| }
|
|
|
| void WaitableEvent::Reset() {
|
| - ResetEvent(event_);
|
| + ResetEvent(handle_);
|
| }
|
|
|
| void WaitableEvent::Signal() {
|
| - SetEvent(event_);
|
| + SetEvent(handle_);
|
| }
|
|
|
| bool WaitableEvent::IsSignaled() {
|
| @@ -36,7 +41,7 @@ bool WaitableEvent::IsSignaled() {
|
| }
|
|
|
| bool WaitableEvent::Wait() {
|
| - DWORD result = WaitForSingleObject(event_, INFINITE);
|
| + DWORD result = WaitForSingleObject(handle_, INFINITE);
|
| // It is most unexpected that this should ever fail. Help consumers learn
|
| // about it if it should ever fail.
|
| DCHECK(result == WAIT_OBJECT_0) << "WaitForSingleObject failed";
|
| @@ -49,7 +54,7 @@ bool WaitableEvent::TimedWait(const TimeDelta& max_time) {
|
| // is in milliseconds. If there are 5.5ms left, should the delay be 5 or 6?
|
| // It should be 6 to avoid returning too early.
|
| double timeout = ceil(max_time.InMillisecondsF());
|
| - DWORD result = WaitForSingleObject(event_, static_cast<DWORD>(timeout));
|
| + DWORD result = WaitForSingleObject(handle_, static_cast<DWORD>(timeout));
|
| switch (result) {
|
| case WAIT_OBJECT_0:
|
| return true;
|
| @@ -62,4 +67,25 @@ bool WaitableEvent::TimedWait(const TimeDelta& max_time) {
|
| return false;
|
| }
|
|
|
| +// static
|
| +size_t WaitableEvent::WaitMany(WaitableEvent** events, size_t count) {
|
| + HANDLE handles[MAXIMUM_WAIT_OBJECTS];
|
| + CHECK(count <= MAXIMUM_WAIT_OBJECTS)
|
| + << "Can only wait on " << MAXIMUM_WAIT_OBJECTS << " with WaitMany";
|
| +
|
| + for (size_t i = 0; i < count; ++i)
|
| + handles[i] = events[i]->handle();
|
| +
|
| + DWORD result =
|
| + WaitForMultipleObjects(count, handles,
|
| + FALSE, // don't wait for all the objects
|
| + INFINITE); // no timeout
|
| + if (result < WAIT_OBJECT_0 || result >= WAIT_OBJECT_0 + count) {
|
| + NOTREACHED() << "WaitForMultipleObjects failed: " << GetLastError();
|
| + return 0;
|
| + }
|
| +
|
| + return result - WAIT_OBJECT_0;
|
| +}
|
| +
|
| } // namespace base
|
|
|