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 |