Index: ipc/ipc_sync_channel.cc |
diff --git a/ipc/ipc_sync_channel.cc b/ipc/ipc_sync_channel.cc |
index a300c0f786702843e48c23ab73069f9fab3e0b42..dfce49315c249b7264baaf3db3ede27083846600 100644 |
--- a/ipc/ipc_sync_channel.cc |
+++ b/ipc/ipc_sync_channel.cc |
@@ -234,6 +234,9 @@ SyncChannel::SyncContext::SyncContext( |
received_sync_msgs_(ReceivedSyncMsgQueue::AddContext()), |
shutdown_event_(shutdown_event), |
restrict_dispatch_group_(kRestrictDispatchGroup_None) { |
+ shutdown_watcher_callback_ = base::Bind( |
+ &SyncChannel::SyncContext::OnWaitableEventSignaled, |
+ base::Unretained(this)); |
dmichael (off chromium)
2013/02/01 17:27:18
Okay, so the problem is if you don't use base::Unr
|
} |
SyncChannel::SyncContext::~SyncContext() { |
@@ -353,7 +356,7 @@ void SyncChannel::SyncContext::OnChannelError() { |
} |
void SyncChannel::SyncContext::OnChannelOpened() { |
- shutdown_watcher_.StartWatching(shutdown_event_, this); |
+ shutdown_watcher_.StartWatching(shutdown_event_, shutdown_watcher_callback_); |
Context::OnChannelOpened(); |
} |
@@ -517,21 +520,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(); |
dmichael (off chromium)
2013/02/01 17:27:18
If you instead just make the callback here (e.g.,
|
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->shutdown_watcher_callback()); |
{ |
MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
@@ -540,7 +544,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 +553,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 +564,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 |