Chromium Code Reviews| Index: content/child/resource_dispatcher.cc |
| diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc |
| index 4398e238603db7c6cca5b11030d9fb750cddbf1e..35ee99ad7dea92efd38fcf3e55cfb889c9141a1a 100644 |
| --- a/content/child/resource_dispatcher.cc |
| +++ b/content/child/resource_dispatcher.cc |
| @@ -169,19 +169,13 @@ bool ResourceDispatcher::OnMessageReceived(const IPC::Message& message) { |
| return true; |
| } |
| - if (request_info->is_deferred) { |
| - request_info->deferred_message_queue.push_back(new IPC::Message(message)); |
| - return true; |
| - } |
| // Make sure any deferred messages are dispatched before we dispatch more. |
| - if (!request_info->deferred_message_queue.empty()) { |
| + if (request_info->is_deferred || |
| + !request_info->deferred_message_queue.empty()) { |
| + request_info->deferred_message_queue.push_back(new IPC::Message(message)); |
| + // Dispatches the messages only if the request is no longer deferred. |
|
kinuko
2016/10/19 13:35:53
nit: to make it clearer that FlushDeferredMessages
jb
2016/10/20 13:06:50
Makes sense. I will add an extra if for clarity.
|
| FlushDeferredMessages(request_id); |
| - request_info = GetPendingRequestInfo(request_id); |
| - DCHECK(request_info); |
| - if (request_info->is_deferred) { |
| - request_info->deferred_message_queue.push_back(new IPC::Message(message)); |
| - return true; |
| - } |
| + return true; |
| } |
| DispatchMessage(message); |
| @@ -580,11 +574,8 @@ void ResourceDispatcher::DispatchMessage(const IPC::Message& message) { |
| } |
| void ResourceDispatcher::FlushDeferredMessages(int request_id) { |
| - PendingRequestMap::iterator it = pending_requests_.find(request_id); |
| - if (it == pending_requests_.end()) // The request could have become invalid. |
| - return; |
| - PendingRequestInfo* request_info = it->second.get(); |
| - if (request_info->is_deferred) |
| + PendingRequestInfo* request_info = GetPendingRequestInfo(request_id); |
| + if (!request_info || request_info->is_deferred) |
| return; |
| // Because message handlers could result in request_info being destroyed, |
| // we need to work with a stack reference to the deferred queue. |
| @@ -595,17 +586,21 @@ void ResourceDispatcher::FlushDeferredMessages(int request_id) { |
| q.pop_front(); |
| DispatchMessage(*m); |
| delete m; |
| - // If this request is deferred in the context of the above message, then |
| - // we should honor the same and stop dispatching further messages. |
| // We need to find the request again in the list as it may have completed |
| // by now and the request_info instance above may be invalid. |
| - PendingRequestMap::iterator index = pending_requests_.find(request_id); |
| - if (index != pending_requests_.end()) { |
| - PendingRequestInfo* pending_request = index->second.get(); |
| - if (pending_request->is_deferred) { |
| - pending_request->deferred_message_queue.swap(q); |
| - return; |
| - } |
| + request_info = GetPendingRequestInfo(request_id); |
| + if (!request_info) { |
| + // The recipient is gone, the messages won't be handled and |
| + // resources they might hold won't be released. Explicitly release |
| + // them from here so that they won't leak. |
| + ReleaseResourcesInMessageQueue(&q); |
|
kinuko
2016/10/19 13:35:53
I think if GetPendingRequestInfo returns null Rele
jb
2016/10/20 13:06:50
In this context the queue in the request_info is s
|
| + return; |
| + } |
| + // If this request is deferred in the context of the above message, then |
| + // we should honor the same and stop dispatching further messages. |
| + if (request_info->is_deferred) { |
| + request_info->deferred_message_queue.swap(q); |
| + return; |
| } |
| } |
| } |