Index: base/synchronization/waitable_event_watcher_posix.cc |
diff --git a/base/synchronization/waitable_event_watcher_posix.cc b/base/synchronization/waitable_event_watcher_posix.cc |
index 3180b4bff413f9432e5fa1e62755770801cb80d8..cc2fbc391d3623598b0d60ecc625838bbf947b16 100644 |
--- a/base/synchronization/waitable_event_watcher_posix.cc |
+++ b/base/synchronization/waitable_event_watcher_posix.cc |
@@ -97,14 +97,14 @@ class AsyncWaiter : public WaitableEvent::Waiter { |
// the event is canceled. |
// ----------------------------------------------------------------------------- |
void AsyncCallbackHelper(Flag* flag, |
- WaitableEventWatcher::Delegate* delegate, |
+ const WaitableEventWatcher::EventCallback& callback, |
WaitableEvent* event) { |
// Runs in MessageLoop thread. |
if (!flag->value()) { |
// This is to let the WaitableEventWatcher know that the event has occured |
// because it needs to be able to return NULL from GetWatchedObject |
flag->Set(); |
- delegate->OnWaitableEventSignaled(event); |
+ callback.Run(event); |
} |
} |
@@ -112,8 +112,7 @@ WaitableEventWatcher::WaitableEventWatcher() |
: message_loop_(NULL), |
cancel_flag_(NULL), |
waiter_(NULL), |
- event_(NULL), |
- delegate_(NULL) { |
+ event_(NULL) { |
} |
WaitableEventWatcher::~WaitableEventWatcher() { |
@@ -124,8 +123,9 @@ WaitableEventWatcher::~WaitableEventWatcher() { |
// The Handle is how the user cancels a wait. After deleting the Handle we |
// insure that the delegate cannot be called. |
// ----------------------------------------------------------------------------- |
-bool WaitableEventWatcher::StartWatching |
- (WaitableEvent* event, WaitableEventWatcher::Delegate* delegate) { |
+bool WaitableEventWatcher::StartWatching( |
+ WaitableEvent* event, |
+ const EventCallback& callback) { |
MessageLoop *const current_ml = MessageLoop::current(); |
DCHECK(current_ml) << "Cannot create WaitableEventWatcher without a " |
"current MessageLoop"; |
@@ -145,12 +145,13 @@ bool WaitableEventWatcher::StartWatching |
DCHECK(!cancel_flag_.get()) << "StartWatching called while still watching"; |
cancel_flag_ = new Flag; |
- callback_ = base::Bind(&AsyncCallbackHelper, cancel_flag_, delegate, event); |
+ callback_ = callback; |
+ internal_callback_ = |
+ base::Bind(&AsyncCallbackHelper, cancel_flag_, callback_, event); |
WaitableEvent::WaitableEventKernel* kernel = event->kernel_.get(); |
AutoLock locked(kernel->lock_); |
- delegate_ = delegate; |
event_ = event; |
if (kernel->signaled_) { |
@@ -159,7 +160,7 @@ bool WaitableEventWatcher::StartWatching |
// No hairpinning - we can't call the delegate directly here. We have to |
// enqueue a task on the MessageLoop as normal. |
- current_ml->PostTask(FROM_HERE, callback_); |
+ current_ml->PostTask(FROM_HERE, internal_callback_); |
return true; |
} |
@@ -167,14 +168,14 @@ bool WaitableEventWatcher::StartWatching |
current_ml->AddDestructionObserver(this); |
kernel_ = kernel; |
- waiter_ = new AsyncWaiter(current_ml, callback_, cancel_flag_); |
+ waiter_ = new AsyncWaiter(current_ml, internal_callback_, cancel_flag_); |
event->Enqueue(waiter_); |
return true; |
} |
void WaitableEventWatcher::StopWatching() { |
- delegate_ = NULL; |
+ callback_.Reset(); |
if (message_loop_) { |
message_loop_->RemoveDestructionObserver(this); |
@@ -227,7 +228,7 @@ void WaitableEventWatcher::StopWatching() { |
// have been enqueued with the MessageLoop because the waiter was never |
// signaled) |
delete waiter_; |
- callback_.Reset(); |
+ internal_callback_.Reset(); |
cancel_flag_ = NULL; |
return; |
} |