| Index: cc/base/completion_event.h
|
| diff --git a/cc/base/completion_event.h b/cc/base/completion_event.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6bae765dd20e2173065bccab670afd2618547a95
|
| --- /dev/null
|
| +++ b/cc/base/completion_event.h
|
| @@ -0,0 +1,63 @@
|
| +// 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 CC_BASE_COMPLETION_EVENT_H_
|
| +#define CC_BASE_COMPLETION_EVENT_H_
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/synchronization/waitable_event.h"
|
| +#include "base/threading/thread_restrictions.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 CompletionEvent {
|
| + public:
|
| + CompletionEvent()
|
| + : event_(false /* manual_reset */, false /* initially_signaled */) {
|
| +#if DCHECK_IS_ON()
|
| + waited_ = false;
|
| + signaled_ = false;
|
| +#endif
|
| + }
|
| +
|
| + ~CompletionEvent() {
|
| +#if DCHECK_IS_ON()
|
| + DCHECK(waited_);
|
| + DCHECK(signaled_);
|
| +#endif
|
| + }
|
| +
|
| + void Wait() {
|
| +#if DCHECK_IS_ON()
|
| + DCHECK(!waited_);
|
| + waited_ = true;
|
| +#endif
|
| + base::ThreadRestrictions::ScopedAllowWait allow_wait;
|
| + event_.Wait();
|
| + }
|
| +
|
| + void Signal() {
|
| +#if DCHECK_IS_ON()
|
| + DCHECK(!signaled_);
|
| + signaled_ = true;
|
| +#endif
|
| + event_.Signal();
|
| + }
|
| +
|
| + private:
|
| + base::WaitableEvent event_;
|
| +#if DCHECK_IS_ON()
|
| + // Used to assert that Wait() and Signal() are each called exactly once.
|
| + bool waited_;
|
| + bool signaled_;
|
| +#endif
|
| +};
|
| +
|
| +} // namespace cc
|
| +
|
| +#endif // CC_BASE_COMPLETION_EVENT_H_
|
|
|