12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_BROWSER_LOADER_RESOURCE_SCHEDULER_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_BROWSER_LOADER_RESOURCE_SCHEDULER_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/non_thread_safe.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/timer/timer.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/content_export.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/priority_queue.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/request_priority.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class HostPortPair; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLRequest; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceThrottle; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// There is one ResourceScheduler. All renderer-initiated HTTP requests are 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// expected to pass through it. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// There are two types of input to the scheduler: 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1. Requests to start, cancel, or finish fetching a resource. 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 2. Notifications for renderer events, such as new tabs, navigation and 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// painting. 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These input come from different threads, so they may not be in sync. The UI 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// thread is considered the authority on renderer lifetime, which means some 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// IPCs may be meaningless if they arrive after the UI thread signals a renderer 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// has been deleted. 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The ResourceScheduler tracks many Clients, which should correlate with tabs. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A client is uniquely identified by its child_id and route_id. 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Each Client may have many Requests in flight. Requests are uniquely 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// identified within a Client by its ScheduledResourceRequest. 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Users should call ScheduleRequest() to notify this ResourceScheduler of a 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// new request. The returned ResourceThrottle should be destroyed when the load 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// finishes or is canceled. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The scheduler may defer issuing the request via the ResourceThrottle 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// interface or it may alter the request's priority by calling set_priority() on 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the URLRequest. 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch enum ClientThrottleState { 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(aiolos): Add logic to ShouldStartRequest for PAUSED Clients to only 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // issue synchronous requests. 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(aiolos): Add max number of THROTTLED Clients, and logic to set 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // subsquent Clients to PAUSED instead. Also add logic to unpause a Client 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // when a background Client becomes COALESCED (ie, finishes loading.) 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(aiolos): Add tests for the above mentioned logic. 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Currently being deleted client. 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This state currently follows the same logic for loading requests as 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // UNTHROTTLED/ACTIVE_AND_LOADING Clients. See above TODO's. 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PAUSED, 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Loaded background client, all observable clients loaded. 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch COALESCED, 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Background client, an observable client is loading. 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch THROTTLED, 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Observable (active) loaded client or 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Loading background client, all observable clients loaded. 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Note that clients which would be COALESCED are UNTHROTTLED until 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // coalescing is turned on. 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UNTHROTTLED, 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Observable (active) loading client. 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ACTIVE_AND_LOADING, 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) enum RequestClassification { 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) NORMAL_REQUEST, 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Low priority in-flight requests 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IN_FLIGHT_DELAYABLE_REQUEST, 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // High-priority requests received before the renderer has a <body> 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) LAYOUT_BLOCKING_REQUEST, 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) }; 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceScheduler(); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~ResourceScheduler(); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Use a mock timer when testing. 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void set_timer_for_testing(scoped_ptr<base::Timer> timer) { 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) coalescing_timer_.reset(timer.release()); 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(aiolos): Remove when throttling and coalescing have landed 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void SetThrottleOptionsForTesting(bool should_throttle, bool should_coalesce); 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool should_coalesce() const { return should_coalesce_; } 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool should_throttle() const { return should_throttle_; } 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ClientThrottleState GetClientStateForTesting(int child_id, int route_id); 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Requests that this ResourceScheduler schedule, and eventually loads, the 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // specified |url_request|. Caller should delete the returned ResourceThrottle 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when the load completes or is canceled. 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceThrottle> ScheduleRequest( 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int child_id, int route_id, net::URLRequest* url_request); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Signals from the UI thread, posted as tasks on the IO thread: 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when a renderer is created. 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnClientCreated(int child_id, int route_id, bool is_visible); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when a renderer is destroyed. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnClientDeleted(int child_id, int route_id); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Called when a renderer stops or restarts loading. 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnLoadingStateChanged(int child_id, int route_id, bool is_loaded); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Called when a Client is shown or hidden. 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnVisibilityChanged(int child_id, int route_id, bool is_visible); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Signals from IPC messages directly from the renderers: 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when a client navigates to a new main document. 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnNavigate(int child_id, int route_id); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when the client has parsed the <body> element. This is a signal that 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resource loads won't interfere with first paint. 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnWillInsertBody(int child_id, int route_id); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Signals from the IO thread: 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Called when we received a response to a http request that was served 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // from a proxy using SPDY. 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnReceivedSpdyProxiedHttpResponse(int child_id, int route_id); 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Client functions: 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Called to check if all user observable tabs have completed loading. 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool active_clients_loaded() const { return active_clients_loading_ == 0; } 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Called when a Client starts or stops playing audio. 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnAudibilityChanged(int child_id, int route_id, bool is_audible); 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool IsClientVisibleForTesting(int child_id, int route_id); 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class RequestQueue; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class ScheduledResourceRequest; 153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch struct RequestPriorityParams; 154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch struct ScheduledResourceSorter { 155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool operator()(const ScheduledResourceRequest* a, 156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const ScheduledResourceRequest* b) const; 157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch }; 1585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu class Client; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef int64 ClientId; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<ClientId, Client*> ClientMap; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::set<ScheduledResourceRequest*> RequestSet; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when a ScheduledResourceRequest is destroyed. 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveRequest(ScheduledResourceRequest* request); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // These calls may update the ThrottleState of all clients, and have the 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // potential to be re-entrant. 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Called when a Client newly becomes active loading. 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void IncrementActiveClientsLoading(); 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Called when an active and loading Client either completes loading or 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // becomes inactive. 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void DecrementActiveClientsLoading(); 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnLoadingActiveClientsStateChangedForAllClients(); 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t CountActiveClientsLoading() const; 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Called when a Client becomes coalesced. 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void IncrementCoalescedClients(); 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Called when a client stops being coalesced. 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void DecrementCoalescedClients(); 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void LoadCoalescedRequests(); 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t CountCoalescedClients() const; 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Update the queue position for |request|, possibly causing it to start 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // loading. 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Queues are maintained for each priority level. When |request| is 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // reprioritized, it will move to the end of the queue for that priority 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // level. 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ReprioritizeRequest(ScheduledResourceRequest* request, 195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net::RequestPriority new_priority, 196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int intra_priority_value); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the client ID for the given |child_id| and |route_id| combo. 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClientId MakeClientId(int child_id, int route_id); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns the client for the given |child_id| and |route_id| combo. 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Client* GetClient(int child_id, int route_id); 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool should_coalesce_; 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool should_throttle_; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClientMap client_map_; 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t active_clients_loading_; 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t coalesced_clients_; 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This is a repeating timer to initiate requests on COALESCED Clients. 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<base::Timer> coalescing_timer_; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestSet unowned_requests_; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_BROWSER_LOADER_RESOURCE_SCHEDULER_H_ 217