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