| Index: content/browser/loader/resource_scheduler.h
|
| diff --git a/content/browser/loader/resource_scheduler.h b/content/browser/loader/resource_scheduler.h
|
| index fa53c5b318f291d1d68a6054f4353d20958552b1..d9711134421c71273abead5be7807bddee68940c 100644
|
| --- a/content/browser/loader/resource_scheduler.h
|
| +++ b/content/browser/loader/resource_scheduler.h
|
| @@ -7,15 +7,14 @@
|
|
|
| #include <map>
|
| #include <set>
|
| -#include <vector>
|
|
|
| #include "base/basictypes.h"
|
| #include "base/compiler_specific.h"
|
| -#include "base/memory/linked_ptr.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/threading/non_thread_safe.h"
|
| #include "content/common/content_export.h"
|
| -#include "content/public/browser/global_request_id.h"
|
| +#include "net/base/priority_queue.h"
|
| +#include "net/base/request_priority.h"
|
|
|
| namespace net {
|
| class URLRequest;
|
| @@ -32,6 +31,11 @@ class ResourceThrottle;
|
| // 2. Notifications for renderer events, such as new tabs, navigation and
|
| // painting.
|
| //
|
| +// These input come from different threads, so they may not be in sync. The UI
|
| +// thread is considered the authority on renderer lifetime, which means some
|
| +// IPCs may be meaningless if they arrive after the UI thread signals a renderer
|
| +// has been deleted.
|
| +//
|
| // The ResourceScheduler tracks many Clients, which should correlate with tabs.
|
| // A client is uniquely identified by its child_id and route_id.
|
| //
|
| @@ -56,12 +60,16 @@ class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe {
|
| scoped_ptr<ResourceThrottle> ScheduleRequest(
|
| int child_id, int route_id, net::URLRequest* url_request);
|
|
|
| + // Signals from the UI thread, posted as tasks on the IO thread:
|
| +
|
| // Called when a renderer is created.
|
| void OnClientCreated(int child_id, int route_id);
|
|
|
| // Called when a renderer is destroyed.
|
| void OnClientDeleted(int child_id, int route_id);
|
|
|
| + // Signals from IPC messages directly from the renderers:
|
| +
|
| // Called when a client navigates to a new main document.
|
| void OnNavigate(int child_id, int route_id);
|
|
|
| @@ -70,32 +78,41 @@ class CONTENT_EXPORT ResourceScheduler : public base::NonThreadSafe {
|
| void OnWillInsertBody(int child_id, int route_id);
|
|
|
| private:
|
| + class RequestQueue;
|
| class ScheduledResourceRequest;
|
| - friend class ScheduledResourceRequest;
|
| struct Client;
|
|
|
| typedef int64 ClientId;
|
| typedef std::map<ClientId, Client*> ClientMap;
|
| - typedef std::vector<ScheduledResourceRequest*> RequestQueue;
|
| typedef std::set<ScheduledResourceRequest*> RequestSet;
|
|
|
| - struct Client {
|
| - Client();
|
| - ~Client();
|
| -
|
| - bool has_body;
|
| - RequestQueue pending_requests;
|
| - RequestSet in_flight_requests;
|
| - };
|
| -
|
| // Called when a ScheduledResourceRequest is destroyed.
|
| void RemoveRequest(ScheduledResourceRequest* request);
|
|
|
| // Unthrottles the |request| and adds it to |client|.
|
| void StartRequest(ScheduledResourceRequest* request, Client* client);
|
|
|
| - // Calls StartRequest on all pending requests for |client|.
|
| - void LoadPendingRequests(Client* client);
|
| + // Update the queue position for |request|, possibly causing it to start
|
| + // loading.
|
| + //
|
| + // Queues are maintained for each priority level. When |request| is
|
| + // reprioritized, it will move to the end of the queue for that priority
|
| + // level.
|
| + void ReprioritizeRequest(ScheduledResourceRequest* request,
|
| + net::RequestPriority new_priority);
|
| +
|
| + // Attempts to load any pending requests in |client|, based on the
|
| + // results of ShouldStartRequest().
|
| + void LoadAnyStartablePendingRequests(Client* client);
|
| +
|
| + // Returns the number of requests with priority < LOW that are currently in
|
| + // flight.
|
| + size_t GetNumDelayableRequestsInFlight(Client* client) const;
|
| +
|
| + // Returns true if the request should start. This is the core scheduling
|
| + // algorithm.
|
| + bool ShouldStartRequest(ScheduledResourceRequest* request,
|
| + Client* client) const;
|
|
|
| // Returns the client ID for the given |child_id| and |route_id| combo.
|
| ClientId MakeClientId(int child_id, int route_id);
|
|
|