Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(311)

Side by Side Diff: content/browser/loader/resource_dispatcher_host_impl.cc

Issue 1117923004: Run load state update timer only when needed (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@cpu
Patch Set: Fixes for mmenke Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc e-loading 5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc e-loading
6 6
7 #include "content/browser/loader/resource_dispatcher_host_impl.h" 7 #include "content/browser/loader/resource_dispatcher_host_impl.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <set> 10 #include <set>
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 108
109 // ---------------------------------------------------------------------------- 109 // ----------------------------------------------------------------------------
110 110
111 namespace content { 111 namespace content {
112 112
113 namespace { 113 namespace {
114 114
115 static ResourceDispatcherHostImpl* g_resource_dispatcher_host; 115 static ResourceDispatcherHostImpl* g_resource_dispatcher_host;
116 116
117 // The interval for calls to ResourceDispatcherHostImpl::UpdateLoadStates 117 // The interval for calls to ResourceDispatcherHostImpl::UpdateLoadStates
118 const int kUpdateLoadStatesIntervalMsec = 100; 118 const int kUpdateLoadStatesIntervalMsec = 250;
119 119
120 // Maximum byte "cost" of all the outstanding requests for a renderer. 120 // Maximum byte "cost" of all the outstanding requests for a renderer.
121 // See delcaration of |max_outstanding_requests_cost_per_process_| for details. 121 // See delcaration of |max_outstanding_requests_cost_per_process_| for details.
122 // This bound is 25MB, which allows for around 6000 outstanding requests. 122 // This bound is 25MB, which allows for around 6000 outstanding requests.
123 const int kMaxOutstandingRequestsCostPerProcess = 26214400; 123 const int kMaxOutstandingRequestsCostPerProcess = 26214400;
124 124
125 // The number of milliseconds after noting a user gesture that we will 125 // The number of milliseconds after noting a user gesture that we will
126 // tag newly-created URLRequest objects with the 126 // tag newly-created URLRequest objects with the
127 // net::LOAD_MAYBE_USER_GESTURE load flag. This is a fairly arbitrary 127 // net::LOAD_MAYBE_USER_GESTURE load flag. This is a fairly arbitrary
128 // guess at how long to expect direct impact from a user gesture, but 128 // guess at how long to expect direct impact from a user gesture, but
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 info->GetContext()->GetRequestContext()->job_factory(); 781 info->GetContext()->GetRequestContext()->job_factory();
782 if (job_factory->IsHandledURL(url)) 782 if (job_factory->IsHandledURL(url))
783 return false; 783 return false;
784 784
785 return delegate_->HandleExternalProtocol( 785 return delegate_->HandleExternalProtocol(
786 url, info->GetChildID(), info->GetRouteID(), info->IsMainFrame(), 786 url, info->GetChildID(), info->GetRouteID(), info->IsMainFrame(),
787 info->GetPageTransition(), info->HasUserGesture()); 787 info->GetPageTransition(), info->HasUserGesture());
788 } 788 }
789 789
790 void ResourceDispatcherHostImpl::DidStartRequest(ResourceLoader* loader) { 790 void ResourceDispatcherHostImpl::DidStartRequest(ResourceLoader* loader) {
791 // Make sure we have the load state monitor running 791 // Make sure we have the load state monitor running.
792 if (!update_load_states_timer_->IsRunning()) { 792 if (!update_load_states_timer_->IsRunning() &&
793 scheduler_->HasLoadingClients()) {
793 update_load_states_timer_->Start( 794 update_load_states_timer_->Start(
794 FROM_HERE, TimeDelta::FromMilliseconds(kUpdateLoadStatesIntervalMsec), 795 FROM_HERE, TimeDelta::FromMilliseconds(kUpdateLoadStatesIntervalMsec),
795 this, &ResourceDispatcherHostImpl::UpdateLoadInfo); 796 this, &ResourceDispatcherHostImpl::UpdateLoadInfo);
796 } 797 }
797 } 798 }
798 799
799 void ResourceDispatcherHostImpl::DidReceiveRedirect(ResourceLoader* loader, 800 void ResourceDispatcherHostImpl::DidReceiveRedirect(ResourceLoader* loader,
800 const GURL& new_url) { 801 const GURL& new_url) {
801 ResourceRequestInfoImpl* info = loader->GetRequestInfo(); 802 ResourceRequestInfoImpl* info = loader->GetRequestInfo();
802 803
(...skipping 971 matching lines...) Expand 10 before | Expand all | Expand 10 after
1774 1775
1775 void ResourceDispatcherHostImpl::RemovePendingLoader( 1776 void ResourceDispatcherHostImpl::RemovePendingLoader(
1776 const LoaderMap::iterator& iter) { 1777 const LoaderMap::iterator& iter) {
1777 ResourceRequestInfoImpl* info = iter->second->GetRequestInfo(); 1778 ResourceRequestInfoImpl* info = iter->second->GetRequestInfo();
1778 1779
1779 // Remove the memory credit that we added when pushing the request onto 1780 // Remove the memory credit that we added when pushing the request onto
1780 // the pending list. 1781 // the pending list.
1781 IncrementOutstandingRequestsMemory(-1, *info); 1782 IncrementOutstandingRequestsMemory(-1, *info);
1782 1783
1783 pending_loaders_.erase(iter); 1784 pending_loaders_.erase(iter);
1784
1785 // If we have no more pending requests, then stop the load state monitor
1786 if (pending_loaders_.empty() && update_load_states_timer_)
1787 update_load_states_timer_->Stop();
1788 } 1785 }
1789 1786
1790 void ResourceDispatcherHostImpl::CancelRequest(int child_id, 1787 void ResourceDispatcherHostImpl::CancelRequest(int child_id,
1791 int request_id) { 1788 int request_id) {
1792 ResourceLoader* loader = GetLoader(child_id, request_id); 1789 ResourceLoader* loader = GetLoader(child_id, request_id);
1793 if (!loader) { 1790 if (!loader) {
1794 // We probably want to remove this warning eventually, but I wanted to be 1791 // We probably want to remove this warning eventually, but I wanted to be
1795 // able to notice when this happens during initial development since it 1792 // able to notice when this happens during initial development since it
1796 // should be rare and may indicate a bug. 1793 // should be rare and may indicate a bug.
1797 DVLOG(1) << "Canceling a request that wasn't found"; 1794 DVLOG(1) << "Canceling a request that wasn't found";
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
2199 LoadInfoIsMoreInteresting(load_info, existing->second)) { 2196 LoadInfoIsMoreInteresting(load_info, existing->second)) {
2200 (*info_map)[id] = load_info; 2197 (*info_map)[id] = load_info;
2201 } 2198 }
2202 } 2199 }
2203 return info_map.Pass(); 2200 return info_map.Pass();
2204 } 2201 }
2205 2202
2206 void ResourceDispatcherHostImpl::UpdateLoadInfo() { 2203 void ResourceDispatcherHostImpl::UpdateLoadInfo() {
2207 scoped_ptr<LoadInfoMap> info_map(GetLoadInfoForAllRoutes()); 2204 scoped_ptr<LoadInfoMap> info_map(GetLoadInfoForAllRoutes());
2208 2205
2209 if (info_map->empty()) 2206 // Stop the timer if there are no more pending requests. Future new requests
2207 // will restart it as necessary.
2208 // Also stop the timer if there are no loading clients, to avoid waking up
2209 // unnecessarily when there is a long running (hanging get) request like when
2210 // on a Google Docs document.
mmenke 2015/05/22 15:19:24 nit: Shouldn't mention Google Docs, think it's fi
Andre 2015/05/22 17:30:21 Done.
2211 if (info_map->empty() || !scheduler_->HasLoadingClients()) {
2212 update_load_states_timer_->Stop();
2210 return; 2213 return;
2214 }
2211 2215
2212 BrowserThread::PostTask( 2216 BrowserThread::PostTask(
2213 BrowserThread::UI, FROM_HERE, 2217 BrowserThread::UI, FROM_HERE,
2214 base::Bind(&ResourceDispatcherHostImpl::UpdateLoadInfoOnUIThread, 2218 base::Bind(&ResourceDispatcherHostImpl::UpdateLoadInfoOnUIThread,
2215 base::Passed(&info_map))); 2219 base::Passed(&info_map)));
2216 } 2220 }
2217 2221
2218 void ResourceDispatcherHostImpl::BlockRequestsForRoute(int child_id, 2222 void ResourceDispatcherHostImpl::BlockRequestsForRoute(int child_id,
2219 int route_id) { 2223 int route_id) {
2220 DCHECK_CURRENTLY_ON(BrowserThread::IO); 2224 DCHECK_CURRENTLY_ON(BrowserThread::IO);
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
2369 2373
2370 // Add a flag to selectively bypass the data reduction proxy if the resource 2374 // Add a flag to selectively bypass the data reduction proxy if the resource
2371 // type is not an image. 2375 // type is not an image.
2372 if (request_data.resource_type != RESOURCE_TYPE_IMAGE) 2376 if (request_data.resource_type != RESOURCE_TYPE_IMAGE)
2373 load_flags |= net::LOAD_BYPASS_DATA_REDUCTION_PROXY; 2377 load_flags |= net::LOAD_BYPASS_DATA_REDUCTION_PROXY;
2374 2378
2375 return load_flags; 2379 return load_flags;
2376 } 2380 }
2377 2381
2378 } // namespace content 2382 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/resource_dispatcher_host_impl.h ('k') | content/browser/loader/resource_scheduler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698