Index: cc/completion_event.h |
diff --git a/cc/completion_event.h b/cc/completion_event.h |
index 638cbb270ce9b24689d5095baf174ade4f4d1a13..462e4ba12f6885a40c01711e66187a2e795c4d52 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 |