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
12namespace 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.
18class CompletionEvent {
19 public:
20  CompletionEvent()
21      : event_(false /* manual_reset */, false /* initially_signaled */) {
22#ifndef NDEBUG
23    waited_ = false;
24    signaled_ = false;
25#endif
26  }
27
28  ~CompletionEvent() {
29#ifndef NDEBUG
30    DCHECK(waited_);
31    DCHECK(signaled_);
32#endif
33  }
34
35  void Wait() {
36#ifndef NDEBUG
37    DCHECK(!waited_);
38    waited_ = true;
39#endif
40    base::ThreadRestrictions::ScopedAllowWait allow_wait;
41    event_.Wait();
42  }
43
44  void Signal() {
45#ifndef NDEBUG
46    DCHECK(!signaled_);
47    signaled_ = true;
48#endif
49    event_.Signal();
50  }
51
52 private:
53  base::WaitableEvent event_;
54#ifndef NDEBUG
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_
64