Index: base/synchronization/waitable_event_watcher.h |
diff --git a/base/synchronization/waitable_event_watcher.h b/base/synchronization/waitable_event_watcher.h |
index eb51effa49932cf250828a2ecc447f9a9c598e71..26ddabd01902ceeeaf1aaa6df27afeafdc3ce3fe 100644 |
--- a/base/synchronization/waitable_event_watcher.h |
+++ b/base/synchronization/waitable_event_watcher.h |
@@ -6,13 +6,14 @@ |
#define BASE_SYNCHRONIZATION_WAITABLE_EVENT_WATCHER_H_ |
#include "base/base_export.h" |
+#include "base/macros.h" |
+#include "base/sequence_checker.h" |
#include "build/build_config.h" |
#if defined(OS_WIN) |
#include "base/win/object_watcher.h" |
#else |
#include "base/callback.h" |
-#include "base/message_loop/message_loop.h" |
#include "base/synchronization/waitable_event.h" |
#endif |
@@ -26,8 +27,8 @@ class WaitableEvent; |
// This class provides a way to wait on a WaitableEvent asynchronously. |
// |
// Each instance of this object can be waiting on a single WaitableEvent. When |
-// the waitable event is signaled, a callback is made in the thread of a given |
-// MessageLoop. This callback can be deleted by deleting the waiter. |
+// the waitable event is signaled, a callback is invoked on the sequence that |
+// called StartWatching(). This callback can be deleted by deleting the waiter. |
// |
// Typical usage: |
// |
@@ -60,53 +61,56 @@ class WaitableEvent; |
class BASE_EXPORT WaitableEventWatcher |
#if defined(OS_WIN) |
- : public win::ObjectWatcher::Delegate { |
-#else |
- : public MessageLoop::DestructionObserver { |
+ : public win::ObjectWatcher::Delegate |
#endif |
+{ |
public: |
typedef Callback<void(WaitableEvent*)> EventCallback; |
WaitableEventWatcher(); |
+ |
+#if defined(OS_WIN) |
~WaitableEventWatcher() override; |
+#else |
+ ~WaitableEventWatcher(); |
+#endif |
- // When @event is signaled, the given callback is called on the thread of the |
- // current message loop when StartWatching is called. |
+ // When |event| is signaled, |callback| is called on the sequence that called |
+ // StartWatching(). |
bool StartWatching(WaitableEvent* event, const EventCallback& callback); |
- // Cancel the current watch. Must be called from the same thread which |
+ // Cancel the current watch. Must be called from the same sequence which |
// started the watch. |
// |
// Does nothing if no event is being watched, nor if the watch has completed. |
// The callback will *not* be called for the current watch after this |
- // function returns. Since the callback runs on the same thread as this |
+ // function returns. Since the callback runs on the same sequence as this |
// function, it cannot be called during this function either. |
void StopWatching(); |
- // Return the currently watched event, or NULL if no object is currently being |
- // watched. |
- WaitableEvent* GetWatchedEvent(); |
- |
- // Return the callback that will be invoked when the event is |
- // signaled. |
- const EventCallback& callback() const { return callback_; } |
- |
private: |
#if defined(OS_WIN) |
void OnObjectSignaled(HANDLE h) override; |
+ |
win::ObjectWatcher watcher_; |
+ EventCallback callback_; |
+ WaitableEvent* event_ = nullptr; |
#else |
- // Implementation of MessageLoop::DestructionObserver |
- void WillDestroyCurrentMessageLoop() override; |
- |
- MessageLoop* message_loop_; |
+ // Initialized in StartWatching(). Set to true before the callback runs. Reset |
dcheng
2016/10/03 21:24:01
Nit: "set to true" => maybe should be worded diffe
fdoray
2016/10/04 12:59:11
Done.
|
+ // in StopWatching() or StartWatching(). |
scoped_refptr<Flag> cancel_flag_; |
- AsyncWaiter* waiter_; |
- base::Closure internal_callback_; |
+ |
+ // Enqueued in the wait list of the watched WaitableEvent. |
+ AsyncWaiter* waiter_ = nullptr; |
+ |
+ // Kernel of the watched WaitableEvent. |
scoped_refptr<WaitableEvent::WaitableEventKernel> kernel_; |
+ |
+ // Ensures that StartWatching() and StopWatching() are called on the same |
+ // sequence. |
+ SequenceChecker sequence_checker_; |
#endif |
- WaitableEvent* event_; |
- EventCallback callback_; |
+ DISALLOW_COPY_AND_ASSIGN(WaitableEventWatcher); |
}; |
} // namespace base |