| 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;
|
| }
|
|
|