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

Unified Diff: content/browser/loader/resource_scheduler.cc

Issue 2552703003: Make reprioritization IPC batch rather than per-request.
Patch Set: Fix some typos. Created 4 years 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/loader/resource_scheduler.cc
diff --git a/content/browser/loader/resource_scheduler.cc b/content/browser/loader/resource_scheduler.cc
index ad67fa91cd5436e240b104b3b3b8a9747ae8553d..c086c6fba2b54c8f49e47abda073cbf2b8774a84 100644
--- a/content/browser/loader/resource_scheduler.cc
+++ b/content/browser/loader/resource_scheduler.cc
@@ -418,6 +418,37 @@ class ResourceScheduler::Client {
}
}
+ void ReprioritizeRequests(
+ const std::vector<std::pair<ScheduledResourceRequest*,
+ RequestPriorityParams>>& change_requests) {
+ bool do_load = false;
+
+ for (auto& change_request : change_requests) {
+ ScheduledResourceRequest* resource_request(change_request.first);
+ const RequestPriorityParams& priority_params(change_request.second);
+
+ bool is_queued = pending_requests_.IsQueued(resource_request);
+
+ do_load |= is_queued && (priority_params.priority >
+ resource_request->url_request()->priority());
+
+ resource_request->url_request()->SetPriority(priority_params.priority);
+ resource_request->set_request_priority_params(priority_params);
+ SetRequestAttributes(resource_request,
+ DetermineRequestAttributes(resource_request));
+
+ if (!is_queued)
+ continue;
+
+ pending_requests_.Erase(resource_request);
+ pending_requests_.Insert(resource_request);
+ }
+
+ // Check if any requests are now able to load at their new priorities.
+ if (do_load)
+ LoadAnyStartablePendingRequests();
+ }
+
private:
enum ShouldStartReqResult {
DO_NOT_START_REQUEST_AND_STOP_SEARCHING,
@@ -916,6 +947,53 @@ void ResourceScheduler::ReprioritizeRequest(net::URLRequest* request,
new_priority_params);
}
+void ResourceScheduler::ReprioritizeRequests(
+ const std::vector<PriorityChangeRequest>& change_requests) {
+ std::map<Client*, std::vector<
+ std::pair<ScheduledResourceRequest*, RequestPriorityParams> > >
+ client_requests;
+ for (auto& change_request : change_requests) {
+ if (change_request.request->load_flags() & net::LOAD_IGNORE_LIMITS) {
+ // Requests with the IGNORE_LIMITS flag must stay at MAXIMUM_PRIORITY.
+ continue;
+ }
+
+ auto* scheduled_resource_request =
+ ScheduledResourceRequest::ForRequest(change_request.request);
+
+ // Downloads don't use the resource scheduler.
+ if (!scheduled_resource_request) {
+ change_request.request->SetPriority(change_request.priority);
+ continue;
+ }
+
+ RequestPriorityParams new_priority_params(
+ change_request.priority, change_request.intra_priority);
+ RequestPriorityParams old_priority_params =
+ scheduled_resource_request->get_request_priority_params();
+
+ if (old_priority_params == new_priority_params)
+ continue;
+
+ ClientMap::iterator client_it =
+ client_map_.find(scheduled_resource_request->client_id());
+ if (client_it == client_map_.end()) {
+ // The client was likely deleted shortly before we received this IPC.
+ change_request.request->SetPriority(new_priority_params.priority);
+ scheduled_resource_request->set_request_priority_params(
+ new_priority_params);
+ continue;
+ }
+
+ client_requests[client_it->second].push_back(std::make_pair(
+ scheduled_resource_request, new_priority_params));
+ }
+
+ for (auto& client_entry : client_requests)
+ client_entry.first->ReprioritizeRequests(client_entry.second);
+}
+
+
ResourceScheduler::ClientId ResourceScheduler::MakeClientId(
int child_id, int route_id) {
return (static_cast<ResourceScheduler::ClientId>(child_id) << 32) | route_id;

Powered by Google App Engine
This is Rietveld 408576698