| Index: ipc/ipc_sync_channel.cc
|
| diff --git a/ipc/ipc_sync_channel.cc b/ipc/ipc_sync_channel.cc
|
| index a300c0f786702843e48c23ab73069f9fab3e0b42..1ce9f6cf7bc25fabf5d7c6bc348bf215d309ebc0 100644
|
| --- a/ipc/ipc_sync_channel.cc
|
| +++ b/ipc/ipc_sync_channel.cc
|
| @@ -353,7 +353,10 @@ void SyncChannel::SyncContext::OnChannelError() {
|
| }
|
|
|
| void SyncChannel::SyncContext::OnChannelOpened() {
|
| - shutdown_watcher_.StartWatching(shutdown_event_, this);
|
| + shutdown_watcher_.StartWatching(
|
| + shutdown_event_,
|
| + base::Bind(&SyncChannel::SyncContext::OnWaitableEventSignaled,
|
| + base::Unretained(this)));
|
| Context::OnChannelOpened();
|
| }
|
|
|
| @@ -396,6 +399,10 @@ void SyncChannel::SyncContext::OnWaitableEventSignaled(WaitableEvent* event) {
|
| }
|
| }
|
|
|
| +base::WaitableEventWatcher::EventCallback
|
| + SyncChannel::SyncContext::MakeWaitableEventCallback() {
|
| + return base::Bind(&SyncChannel::SyncContext::OnWaitableEventSignaled, this);
|
| +}
|
|
|
| SyncChannel::SyncChannel(
|
| const IPC::ChannelHandle& channel_handle,
|
| @@ -517,21 +524,22 @@ void SyncChannel::WaitForReplyWithNestedMessageLoop(SyncContext* context) {
|
| base::WaitableEventWatcher* old_send_done_event_watcher =
|
| sync_msg_queue->top_send_done_watcher();
|
|
|
| - base::WaitableEventWatcher::Delegate* old_delegate = NULL;
|
| + base::WaitableEventWatcher::EventCallback old_callback;
|
| base::WaitableEvent* old_event = NULL;
|
|
|
| // Maintain a local global stack of send done delegates to ensure that
|
| // nested sync calls complete in the correct sequence, i.e. the
|
| // outermost call completes first, etc.
|
| if (old_send_done_event_watcher) {
|
| - old_delegate = old_send_done_event_watcher->delegate();
|
| + old_callback = old_send_done_event_watcher->callback();
|
| old_event = old_send_done_event_watcher->GetWatchedEvent();
|
| old_send_done_event_watcher->StopWatching();
|
| }
|
|
|
| sync_msg_queue->set_top_send_done_watcher(&send_done_watcher);
|
|
|
| - send_done_watcher.StartWatching(context->GetSendDoneEvent(), context);
|
| + send_done_watcher.StartWatching(context->GetSendDoneEvent(),
|
| + context->MakeWaitableEventCallback());
|
|
|
| {
|
| MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current());
|
| @@ -540,7 +548,7 @@ void SyncChannel::WaitForReplyWithNestedMessageLoop(SyncContext* context) {
|
|
|
| sync_msg_queue->set_top_send_done_watcher(old_send_done_event_watcher);
|
| if (old_send_done_event_watcher && old_event) {
|
| - old_send_done_event_watcher->StartWatching(old_event, old_delegate);
|
| + old_send_done_event_watcher->StartWatching(old_event, old_callback);
|
| }
|
| }
|
|
|
| @@ -549,7 +557,7 @@ void SyncChannel::OnWaitableEventSignaled(WaitableEvent* event) {
|
| // The call to DispatchMessages might delete this object, so reregister
|
| // the object watcher first.
|
| event->Reset();
|
| - dispatch_watcher_.StartWatching(event, this);
|
| + dispatch_watcher_.StartWatching(event, dispatch_watcher_callback_);
|
| sync_context()->DispatchMessages();
|
| }
|
|
|
| @@ -560,7 +568,11 @@ void SyncChannel::StartWatching() {
|
| // stop or keep watching. So we always watch it, and create the event as
|
| // manual reset since the object watcher might otherwise reset the event
|
| // when we're doing a WaitMany.
|
| - dispatch_watcher_.StartWatching(sync_context()->GetDispatchEvent(), this);
|
| + dispatch_watcher_callback_ =
|
| + base::Bind(&SyncChannel::OnWaitableEventSignaled,
|
| + base::Unretained(this));
|
| + dispatch_watcher_.StartWatching(sync_context()->GetDispatchEvent(),
|
| + dispatch_watcher_callback_);
|
| }
|
|
|
| } // namespace IPC
|
|
|