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