diff options
Diffstat (limited to 'cc/completion_event.h')
-rw-r--r-- | cc/completion_event.h | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/cc/completion_event.h b/cc/completion_event.h index 638cbb2..462e4ba 100644 --- a/cc/completion_event.h +++ b/cc/completion_event.h @@ -1,3 +1,62 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. +// 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 CCCompletionEvent_h +#define CCCompletionEvent_h + +#include "base/synchronization/waitable_event.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 CCCompletionEvent { +public: + CCCompletionEvent() + : m_event(false /* manual_reset */, false /* initially_signaled */) + { +#ifndef NDEBUG + m_waited = false; + m_signaled = false; +#endif + } + + ~CCCompletionEvent() + { + ASSERT(m_waited); + ASSERT(m_signaled); + } + + void wait() + { + ASSERT(!m_waited); +#ifndef NDEBUG + m_waited = true; +#endif + m_event.Wait(); + } + + void signal() + { + ASSERT(!m_signaled); +#ifndef NDEBUG + m_signaled = true; +#endif + m_event.Signal(); + } + +private: + base::WaitableEvent m_event; +#ifndef NDEBUG + // Used to assert that wait() and signal() are each called exactly once. + bool m_waited; + bool m_signaled; +#endif +}; + +} + +#endif |