Home | History | Annotate | Download | only in base
      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 #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