| Index: base/synchronization/waitable_event_watcher_posix.cc
|
| ===================================================================
|
| --- base/synchronization/waitable_event_watcher_posix.cc (revision 179992)
|
| +++ base/synchronization/waitable_event_watcher_posix.cc (working copy)
|
| @@ -97,14 +97,14 @@
|
| // the event is canceled.
|
| // -----------------------------------------------------------------------------
|
| void AsyncCallbackHelper(Flag* flag,
|
| - const WaitableEventWatcher::EventCallback& callback,
|
| + WaitableEventWatcher::Delegate* delegate,
|
| 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();
|
| - callback.Run(event);
|
| + delegate->OnWaitableEventSignaled(event);
|
| }
|
| }
|
|
|
| @@ -112,7 +112,8 @@
|
| : message_loop_(NULL),
|
| cancel_flag_(NULL),
|
| waiter_(NULL),
|
| - event_(NULL) {
|
| + event_(NULL),
|
| + delegate_(NULL) {
|
| }
|
|
|
| WaitableEventWatcher::~WaitableEventWatcher() {
|
| @@ -123,9 +124,8 @@
|
| // 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,
|
| - const EventCallback& callback) {
|
| +bool WaitableEventWatcher::StartWatching
|
| + (WaitableEvent* event, WaitableEventWatcher::Delegate* delegate) {
|
| MessageLoop *const current_ml = MessageLoop::current();
|
| DCHECK(current_ml) << "Cannot create WaitableEventWatcher without a "
|
| "current MessageLoop";
|
| @@ -145,13 +145,12 @@
|
| DCHECK(!cancel_flag_.get()) << "StartWatching called while still watching";
|
|
|
| cancel_flag_ = new Flag;
|
| - callback_ = callback;
|
| - internal_callback_ =
|
| - base::Bind(&AsyncCallbackHelper, cancel_flag_, callback_, event);
|
| + callback_ = base::Bind(&AsyncCallbackHelper, cancel_flag_, delegate, event);
|
| WaitableEvent::WaitableEventKernel* kernel = event->kernel_.get();
|
|
|
| AutoLock locked(kernel->lock_);
|
|
|
| + delegate_ = delegate;
|
| event_ = event;
|
|
|
| if (kernel->signaled_) {
|
| @@ -160,7 +159,7 @@
|
|
|
| // 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, internal_callback_);
|
| + current_ml->PostTask(FROM_HERE, callback_);
|
| return true;
|
| }
|
|
|
| @@ -168,14 +167,14 @@
|
| current_ml->AddDestructionObserver(this);
|
|
|
| kernel_ = kernel;
|
| - waiter_ = new AsyncWaiter(current_ml, internal_callback_, cancel_flag_);
|
| + waiter_ = new AsyncWaiter(current_ml, callback_, cancel_flag_);
|
| event->Enqueue(waiter_);
|
|
|
| return true;
|
| }
|
|
|
| void WaitableEventWatcher::StopWatching() {
|
| - callback_.Reset();
|
| + delegate_ = NULL;
|
|
|
| if (message_loop_) {
|
| message_loop_->RemoveDestructionObserver(this);
|
| @@ -228,7 +227,7 @@
|
| // have been enqueued with the MessageLoop because the waiter was never
|
| // signaled)
|
| delete waiter_;
|
| - internal_callback_.Reset();
|
| + callback_.Reset();
|
| cancel_flag_ = NULL;
|
| return;
|
| }
|
|
|