Index: content/browser/loader/resource_scheduler.cc |
diff --git a/content/browser/loader/resource_scheduler.cc b/content/browser/loader/resource_scheduler.cc |
index 15c70270033dc8dbf563752b7aa50be12496b047..546401e7f7b33b0d207b7aa0af05000877b11578 100644 |
--- a/content/browser/loader/resource_scheduler.cc |
+++ b/content/browser/loader/resource_scheduler.cc |
@@ -178,13 +178,51 @@ class ResourceScheduler::ScheduledResourceRequest |
// Each client represents a tab. |
struct ResourceScheduler::Client { |
James Simonsen
2014/03/05 02:30:59
This isn't a struct anymore. To keep these methods
|
- Client() : has_body(false), using_spdy_proxy(false) {} |
+ Client() |
+ : has_body(false), |
+ using_spdy_proxy(false), |
+ total_delayable_count(0) {} |
~Client() {} |
bool has_body; |
bool using_spdy_proxy; |
RequestQueue pending_requests; |
RequestSet in_flight_requests; |
+ size_t total_delayable_count; |
+ |
+ bool IsDelayableRequest(ScheduledResourceRequest* request) { |
+ if (request->url_request()->priority() < net::LOW) { |
+ net::HostPortPair host_port_pair = |
+ net::HostPortPair::FromURL(request->url_request()->url()); |
+ const net::HttpServerProperties& http_server_properties = |
+ *request->url_request()->context()->http_server_properties(); |
+ if (!http_server_properties.SupportsSpdy(host_port_pair)) { |
+ return true; |
+ } |
+ } |
+ return false; |
+ } |
+ |
+ void InsertFlightRequests(ScheduledResourceRequest* request) { |
James Simonsen
2014/03/05 02:30:59
This should be InsertInFlightRequest().
|
+ in_flight_requests.insert(request); |
+ if (IsDelayableRequest(request)) |
+ total_delayable_count++; |
+ } |
+ |
+ size_t EraseFlightRequests(ScheduledResourceRequest* request) { |
James Simonsen
2014/03/05 02:30:59
And EraseInFlightRequest().
|
+ size_t erased = in_flight_requests.erase(request); |
+ if (in_flight_requests.size() == 0) { |
+ total_delayable_count = 0; |
+ } else if (IsDelayableRequest(request)) { |
+ total_delayable_count--; |
+ } |
+ return erased; |
+ } |
+ |
+ void ClearFlightRequests() { |
James Simonsen
2014/03/05 02:30:59
ClearInFlightRequests()
|
+ in_flight_requests.clear(); |
+ total_delayable_count = 0; |
+ } |
}; |
ResourceScheduler::ResourceScheduler() { |
@@ -242,7 +280,7 @@ void ResourceScheduler::RemoveRequest(ScheduledResourceRequest* request) { |
client->pending_requests.Erase(request); |
DCHECK(!ContainsKey(client->in_flight_requests, request)); |
} else { |
- size_t erased = client->in_flight_requests.erase(request); |
+ size_t erased = client->EraseFlightRequests(request); |
DCHECK(erased); |
// Removing this request may have freed up another to load. |
@@ -275,7 +313,7 @@ void ResourceScheduler::OnClientDeleted(int child_id, int route_id) { |
it != client->in_flight_requests.end(); ++it) { |
unowned_requests_.insert(*it); |
} |
- client->in_flight_requests.clear(); |
+ client->ClearFlightRequests(); |
delete client; |
client_map_.erase(it); |
@@ -331,7 +369,7 @@ void ResourceScheduler::OnReceivedSpdyProxiedHttpResponse( |
void ResourceScheduler::StartRequest(ScheduledResourceRequest* request, |
Client* client) { |
- client->in_flight_requests.insert(request); |
+ client->InsertFlightRequests(request); |
request->Start(); |
} |
@@ -355,6 +393,10 @@ void ResourceScheduler::ReprioritizeRequest(ScheduledResourceRequest* request, |
Client *client = client_it->second; |
if (!client->pending_requests.IsQueued(request)) { |
DCHECK(ContainsKey(client->in_flight_requests, request)); |
+ if (new_priority >= net::LOW) { |
+ if (client->IsDelayableRequest(request)) |
+ client->total_delayable_count--; |
James Simonsen
2014/03/05 02:30:59
Please add a unit test that shows the old code was
James Simonsen
2014/03/05 02:30:59
I don't like that total_delayable_count is sometim
|
+ } |
// Request has already started. |
return; |
} |
@@ -406,15 +448,11 @@ void ResourceScheduler::LoadAnyStartablePendingRequests(Client* client) { |
} |
} |
-void ResourceScheduler::GetNumDelayableRequestsInFlight( |
+size_t ResourceScheduler::GetNumSameHostRequestsInFlight( |
Client* client, |
- const net::HostPortPair& active_request_host, |
- size_t* total_delayable, |
- size_t* total_for_active_host) const { |
- DCHECK(client != NULL && total_delayable != NULL && |
- total_for_active_host != NULL); |
+ const net::HostPortPair& active_request_host) const { |
+ DCHECK(client != NULL); |
- size_t total_delayable_count = 0; |
size_t same_host_count = 0; |
for (RequestSet::iterator it = client->in_flight_requests.begin(); |
it != client->in_flight_requests.end(); ++it) { |
@@ -424,18 +462,8 @@ void ResourceScheduler::GetNumDelayableRequestsInFlight( |
if (active_request_host.Equals(host_port_pair)) { |
same_host_count++; |
} |
- |
- if ((*it)->url_request()->priority() < net::LOW) { |
- const net::HttpServerProperties& http_server_properties = |
- *(*it)->url_request()->context()->http_server_properties(); |
- |
- if (!http_server_properties.SupportsSpdy(host_port_pair)) { |
- ++total_delayable_count; |
- } |
- } |
} |
- *total_delayable = total_delayable_count; |
- *total_for_active_host = same_host_count; |
+ return same_host_count; |
} |
// ShouldStartRequest is the main scheduling algorithm. |
@@ -490,11 +518,9 @@ ResourceScheduler::ShouldStartReqResult ResourceScheduler::ShouldStartRequest( |
return START_REQUEST; |
} |
- size_t num_delayable_requests_in_flight = 0; |
- size_t num_requests_in_flight_for_host = 0; |
- GetNumDelayableRequestsInFlight(client, host_port_pair, |
- &num_delayable_requests_in_flight, |
- &num_requests_in_flight_for_host); |
+ size_t num_delayable_requests_in_flight = client->total_delayable_count; |
+ size_t num_requests_in_flight_for_host = |
+ GetNumSameHostRequestsInFlight(client, host_port_pair); |
if (num_delayable_requests_in_flight >= kMaxNumDelayableRequestsPerClient) { |
return DO_NOT_START_REQUEST_AND_STOP_SEARCHING; |