diff options
Diffstat (limited to 'chromium/cc/base/completion_event.h')
-rw-r--r-- | chromium/cc/base/completion_event.h | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/chromium/cc/base/completion_event.h b/chromium/cc/base/completion_event.h new file mode 100644 index 00000000000..759ce9c3a27 --- /dev/null +++ b/chromium/cc/base/completion_event.h @@ -0,0 +1,63 @@ +// Copyright 2011 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. + +#ifndef CC_BASE_COMPLETION_EVENT_H_ +#define CC_BASE_COMPLETION_EVENT_H_ + +#include "base/logging.h" +#include "base/synchronization/waitable_event.h" +#include "base/threading/thread_restrictions.h" + +namespace cc { + +// Used for making blocking calls from one thread to another. Use only when +// absolutely certain that doing-so will not lead to a deadlock. +// +// It is safe to destroy this object as soon as Wait() returns. +class CompletionEvent { + public: + CompletionEvent() + : event_(false /* manual_reset */, false /* initially_signaled */) { +#ifndef NDEBUG + waited_ = false; + signaled_ = false; +#endif + } + + ~CompletionEvent() { +#ifndef NDEBUG + DCHECK(waited_); + DCHECK(signaled_); +#endif + } + + void Wait() { +#ifndef NDEBUG + DCHECK(!waited_); + waited_ = true; +#endif + base::ThreadRestrictions::ScopedAllowWait allow_wait; + event_.Wait(); + } + + void Signal() { +#ifndef NDEBUG + DCHECK(!signaled_); + signaled_ = true; +#endif + event_.Signal(); + } + + private: + base::WaitableEvent event_; +#ifndef NDEBUG + // Used to assert that Wait() and Signal() are each called exactly once. + bool waited_; + bool signaled_; +#endif +}; + +} // namespace cc + +#endif // CC_BASE_COMPLETION_EVENT_H_ |