diff options
author | darin@google.com <darin@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-08-09 03:27:08 +0000 |
---|---|---|
committer | darin@google.com <darin@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-08-09 03:27:08 +0000 |
commit | 0a646946bcb2d40e003494ad32721d333f47382b (patch) | |
tree | 22dab319734c75f0c8e3a6d8accbdeca1f2f36ed /base/waitable_event_win.cc | |
parent | 8687244a01e4333ed0edb429bdefbf88f83e965b (diff) | |
download | chromium_src-0a646946bcb2d40e003494ad32721d333f47382b.zip chromium_src-0a646946bcb2d40e003494ad32721d333f47382b.tar.gz chromium_src-0a646946bcb2d40e003494ad32721d333f47382b.tar.bz2 |
A basic wrapper for a windows event object that encapsulates the way we often use windows events. This API is not meant to be compatible with ObjectWatcher or MessageLoop::WatchObject. This API is meant to be easily ported to Mac & Linux using a traditional mutex and condition variable pairing.
There's nothing to test here since the implementation is such a thin wrapper around Win32 APIs. However, once we go off to implement a posix version, we'll need some tests.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@620 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/waitable_event_win.cc')
-rw-r--r-- | base/waitable_event_win.cc | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/base/waitable_event_win.cc b/base/waitable_event_win.cc new file mode 100644 index 0000000..58fbfde --- /dev/null +++ b/base/waitable_event_win.cc @@ -0,0 +1,84 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "base/waitable_event.h" + +#include <windows.h> +#include "base/logging.h" + +namespace base { + +WaitableEvent::WaitableEvent(bool manual_reset, bool signaled) + : event_(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_); +} + +WaitableEvent::~WaitableEvent() { + CloseHandle(event_); +} + +void WaitableEvent::Reset() { + ResetEvent(event_); +} + +void WaitableEvent::Signal() { + SetEvent(event_); +} + +bool WaitableEvent::IsSignaled() { + return TimedWait(TimeDelta::FromMilliseconds(0)); +} + +bool WaitableEvent::Wait() { + DWORD result = WaitForSingleObject(event_, 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"; + return result == WAIT_OBJECT_0; +} + +bool WaitableEvent::TimedWait(const TimeDelta& max_time) { + int32 timeout = static_cast<int32>(max_time.InMilliseconds()); + DWORD result = WaitForSingleObject(event_, timeout); + switch (result) { + case WAIT_OBJECT_0: + return true; + case WAIT_TIMEOUT: + return false; + } + // It is most unexpected that this should ever fail. Help consumers learn + // about it if it should ever fail. + NOTREACHED() << "WaitForSingleObject failed"; + return false; + +} + +} // namespace base |