Chromium Code Reviews| Index: content/browser/loader/resource_dispatcher_host_impl.cc |
| diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc |
| index a1cb1f1c15e8c7a0499e157d2e19c6ae16234193..502f15c6b8890ba722b1574782cf70f107d00b7a 100644 |
| --- a/content/browser/loader/resource_dispatcher_host_impl.cc |
| +++ b/content/browser/loader/resource_dispatcher_host_impl.cc |
| @@ -1004,10 +1004,13 @@ void ResourceDispatcherHostImpl::UpdateRequestForTransfer( |
| GlobalRequestID new_request_id(child_id, request_id); |
| // Clear out data that depends on |info| before updating it. |
| + // We always need to move the memory stats to the new process. In contrast, |
| + // stats.num_requests is only tracked for some requests (those that require |
| + // file descriptors for their shared memory buffer). |
| IncrementOutstandingRequestsMemory(-1, *info); |
| - OustandingRequestsStats empty_stats = { 0, 0 }; |
| - OustandingRequestsStats old_stats = GetOutstandingRequestsStats(*info); |
| - UpdateOutstandingRequestsStats(*info, empty_stats); |
| + bool should_update_count = info->counted_as_in_flight_request(); |
| + if (should_update_count) |
| + IncrementOutstandingRequestsCount(-1, *info); |
| pending_loaders_.erase(old_request_id); |
| // ResourceHandlers should always get state related to the request from the |
| @@ -1020,8 +1023,9 @@ void ResourceDispatcherHostImpl::UpdateRequestForTransfer( |
| // Update maps that used the old IDs, if necessary. Some transfers in tests |
| // do not actually use a different ID, so not all maps need to be updated. |
| pending_loaders_[new_request_id] = loader; |
| - UpdateOutstandingRequestsStats(*info, old_stats); |
| IncrementOutstandingRequestsMemory(1, *info); |
| + if (should_update_count) |
| + IncrementOutstandingRequestsCount(1, *info); |
| if (old_routing_id != new_routing_id) { |
| if (blocked_loaders_map_.find(old_routing_id) != |
| blocked_loaders_map_.end()) { |
| @@ -1727,10 +1731,16 @@ ResourceDispatcherHostImpl::IncrementOutstandingRequestsMemory( |
| ResourceDispatcherHostImpl::OustandingRequestsStats |
| ResourceDispatcherHostImpl::IncrementOutstandingRequestsCount( |
| int count, |
| - const ResourceRequestInfoImpl& info) { |
| + ResourceRequestInfoImpl& info) { |
|
davidben
2014/10/15 19:15:12
Nit: probably should be passed in as pointer.
Charlie Reis
2014/10/15 19:48:00
Yep.
|
| DCHECK_EQ(1, abs(count)); |
| num_in_flight_requests_ += count; |
| + // Keep track of whether this request is counting toward the number of |
| + // in-flight requests for this process, in case we need to transfer it to |
| + // another process. This should be a toggle. |
| + DCHECK_NE(info.counted_as_in_flight_request(), count > 0); |
| + info.set_counted_as_in_flight_request(count > 0); |
| + |
| OustandingRequestsStats stats = GetOutstandingRequestsStats(info); |
| stats.num_requests += count; |
| DCHECK_GE(stats.num_requests, 0); |
| @@ -1740,9 +1750,8 @@ ResourceDispatcherHostImpl::IncrementOutstandingRequestsCount( |
| } |
| bool ResourceDispatcherHostImpl::HasSufficientResourcesForRequest( |
| - const net::URLRequest* request_) { |
| - const ResourceRequestInfoImpl* info = |
| - ResourceRequestInfoImpl::ForRequest(request_); |
| + net::URLRequest* request) { |
| + ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); |
| OustandingRequestsStats stats = IncrementOutstandingRequestsCount(1, *info); |
| if (stats.num_requests > max_num_in_flight_requests_per_process_) |
| @@ -1754,9 +1763,8 @@ bool ResourceDispatcherHostImpl::HasSufficientResourcesForRequest( |
| } |
| void ResourceDispatcherHostImpl::FinishedWithResourcesForRequest( |
| - const net::URLRequest* request_) { |
| - const ResourceRequestInfoImpl* info = |
| - ResourceRequestInfoImpl::ForRequest(request_); |
| + net::URLRequest* request) { |
| + ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); |
| IncrementOutstandingRequestsCount(-1, *info); |
| } |