| Index: chrome/browser/renderer_host/resource_dispatcher_host.h
 | 
| ===================================================================
 | 
| --- chrome/browser/renderer_host/resource_dispatcher_host.h	(revision 9239)
 | 
| +++ chrome/browser/renderer_host/resource_dispatcher_host.h	(working copy)
 | 
| @@ -81,6 +81,7 @@
 | 
|            upload_size(upload_size),
 | 
|            last_upload_position(0),
 | 
|            waiting_for_upload_progress_ack(false),
 | 
| +          memory_cost(0),
 | 
|            is_paused(false),
 | 
|            has_started_reading(false),
 | 
|            paused_read_bytes(0) {
 | 
| @@ -135,6 +136,10 @@
 | 
|  
 | 
|      bool waiting_for_upload_progress_ack;
 | 
|  
 | 
| +    // The approximate in-memory size (bytes) that we credited this request
 | 
| +    // as consuming in |outstanding_requests_memory_cost_map_|.
 | 
| +    int memory_cost;
 | 
| +
 | 
|     private:
 | 
|      // Request is temporarily not handling network data. Should be used only
 | 
|      // by the ResourceDispatcherHost, not the event handlers.
 | 
| @@ -246,7 +251,20 @@
 | 
|    int pending_requests() const {
 | 
|      return static_cast<int>(pending_requests_.size());
 | 
|    }
 | 
| +  
 | 
| +  // Intended for unit-tests only. Returns the memory cost of all the
 | 
| +  // outstanding requests (pending and blocked) for |render_process_host_id|.
 | 
| +  int GetOutstandingRequestsMemoryCost(int render_process_host_id) const;
 | 
|  
 | 
| +  // Used by unit-tests to override the max outstanding requests constraint.
 | 
| +  void set_max_outstanding_requests_cost_per_process(int limit) {
 | 
| +    max_outstanding_requests_cost_per_process_ = limit;
 | 
| +  }
 | 
| +
 | 
| +  // The average private bytes increase of the browser for each new pending
 | 
| +  // request. Experimentally obtained.
 | 
| +  static const int kAvgBytesPerOutstandingRequest = 4400;
 | 
| +
 | 
|    DownloadFileManager* download_file_manager() const {
 | 
|      return download_file_manager_;
 | 
|    }
 | 
| @@ -341,6 +359,11 @@
 | 
|  
 | 
|   private:
 | 
|    FRIEND_TEST(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies);
 | 
| +  FRIEND_TEST(ResourceDispatcherHostTest,
 | 
| +              IncrementOutstandingRequestsMemoryCost);
 | 
| +  FRIEND_TEST(ResourceDispatcherHostTest,
 | 
| +              CalculateApproximateMemoryCost);
 | 
| +
 | 
|    class ShutdownTask;
 | 
|  
 | 
|    friend class ShutdownTask;
 | 
| @@ -388,6 +411,18 @@
 | 
|    // Helper function for regular and download requests.
 | 
|    void BeginRequestInternal(URLRequest* request, bool mixed_content);
 | 
|  
 | 
| +  // Updates the "cost" of outstanding requests for |render_process_host_id|.
 | 
| +  // The "cost" approximates how many bytes are consumed by all the in-memory
 | 
| +  // data structures supporting this request (URLRequest object,
 | 
| +  // HttpNetworkTransaction, etc...).
 | 
| +  // The value of |cost| is added to the running total, and the resulting
 | 
| +  // sum is returned. 
 | 
| +  int IncrementOutstandingRequestsMemoryCost(int cost,
 | 
| +                                             int render_process_host_id);
 | 
| +
 | 
| +  // Estimate how much heap space |request| will consume to run.
 | 
| +  static int CalculateApproximateMemoryCost(URLRequest* request);
 | 
| +
 | 
|    // The list of all requests that we have pending. This list is not really
 | 
|    // optimized, and assumes that we have relatively few requests pending at once
 | 
|    // since some operations require brute-force searching of the list.
 | 
| @@ -477,6 +512,20 @@
 | 
|    typedef std::map<ProcessRendererIDs, BlockedRequestsList*> BlockedRequestMap;
 | 
|    BlockedRequestMap blocked_requests_map_;
 | 
|  
 | 
| +  // Maps the render_process_host_ids to the approximate number of bytes 
 | 
| +  // being used to service its resource requests. No entry implies 0 cost.
 | 
| +  typedef std::map<int, int> OutstandingRequestsMemoryCostMap;
 | 
| +  OutstandingRequestsMemoryCostMap outstanding_requests_memory_cost_map_;
 | 
| +
 | 
| +  // |max_outstanding_requests_cost_per_process_| is the upper bound on how
 | 
| +  // many outstanding requests can be issued per render process host.
 | 
| +  // The constraint is expressed in terms of bytes (where the cost of
 | 
| +  // individual requests is given by CalculateApproximateMemoryCost).
 | 
| +  // The total number of outstanding requests is roughly:
 | 
| +  //   (max_outstanding_requests_cost_per_process_ /
 | 
| +  //       kAvgBytesPerOutstandingRequest)
 | 
| +  int max_outstanding_requests_cost_per_process_;
 | 
| +
 | 
|    DISALLOW_COPY_AND_ASSIGN(ResourceDispatcherHost);
 | 
|  };
 | 
|  
 | 
| 
 |