OLD | NEW |
| (Empty) |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef CC_BASE_COMPLETION_EVENT_H_ | |
6 #define CC_BASE_COMPLETION_EVENT_H_ | |
7 | |
8 #include "base/logging.h" | |
9 #include "base/synchronization/waitable_event.h" | |
10 #include "base/threading/thread_restrictions.h" | |
11 | |
12 namespace cc { | |
13 | |
14 // Used for making blocking calls from one thread to another. Use only when | |
15 // absolutely certain that doing-so will not lead to a deadlock. | |
16 // | |
17 // It is safe to destroy this object as soon as Wait() returns. | |
18 class CompletionEvent { | |
19 public: | |
20 CompletionEvent() | |
21 : event_(false /* manual_reset */, false /* initially_signaled */) { | |
22 #if DCHECK_IS_ON() | |
23 waited_ = false; | |
24 signaled_ = false; | |
25 #endif | |
26 } | |
27 | |
28 ~CompletionEvent() { | |
29 #if DCHECK_IS_ON() | |
30 DCHECK(waited_); | |
31 DCHECK(signaled_); | |
32 #endif | |
33 } | |
34 | |
35 void Wait() { | |
36 #if DCHECK_IS_ON() | |
37 DCHECK(!waited_); | |
38 waited_ = true; | |
39 #endif | |
40 base::ThreadRestrictions::ScopedAllowWait allow_wait; | |
41 event_.Wait(); | |
42 } | |
43 | |
44 void Signal() { | |
45 #if DCHECK_IS_ON() | |
46 DCHECK(!signaled_); | |
47 signaled_ = true; | |
48 #endif | |
49 event_.Signal(); | |
50 } | |
51 | |
52 private: | |
53 base::WaitableEvent event_; | |
54 #if DCHECK_IS_ON() | |
55 // Used to assert that Wait() and Signal() are each called exactly once. | |
56 bool waited_; | |
57 bool signaled_; | |
58 #endif | |
59 }; | |
60 | |
61 } // namespace cc | |
62 | |
63 #endif // CC_BASE_COMPLETION_EVENT_H_ | |
OLD | NEW |