| OLD | NEW | 
|---|
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 // This is the browser side of the resource dispatcher, it receives requests | 5 // This is the browser side of the resource dispatcher, it receives requests | 
| 6 // from the RenderProcessHosts, and dispatches them to URLRequests. It then | 6 // from the RenderProcessHosts, and dispatches them to URLRequests. It then | 
| 7 // fowards the messages from the URLRequests back to the correct process for | 7 // fowards the messages from the URLRequests back to the correct process for | 
| 8 // handling. | 8 // handling. | 
| 9 // | 9 // | 
| 10 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
     e-loading | 10 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
     e-loading | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 74           pending_data_count(0), | 74           pending_data_count(0), | 
| 75           is_download(false), | 75           is_download(false), | 
| 76           pause_count(0), | 76           pause_count(0), | 
| 77           mixed_content(mixed_content), | 77           mixed_content(mixed_content), | 
| 78           resource_type(resource_type), | 78           resource_type(resource_type), | 
| 79           filter_policy(FilterPolicy::DONT_FILTER), | 79           filter_policy(FilterPolicy::DONT_FILTER), | 
| 80           last_load_state(net::LOAD_STATE_IDLE), | 80           last_load_state(net::LOAD_STATE_IDLE), | 
| 81           upload_size(upload_size), | 81           upload_size(upload_size), | 
| 82           last_upload_position(0), | 82           last_upload_position(0), | 
| 83           waiting_for_upload_progress_ack(false), | 83           waiting_for_upload_progress_ack(false), | 
|  | 84           memory_cost(0), | 
| 84           is_paused(false), | 85           is_paused(false), | 
| 85           has_started_reading(false), | 86           has_started_reading(false), | 
| 86           paused_read_bytes(0) { | 87           paused_read_bytes(0) { | 
| 87     } | 88     } | 
| 88 | 89 | 
| 89     // Top-level ResourceHandler servicing this request. | 90     // Top-level ResourceHandler servicing this request. | 
| 90     scoped_refptr<ResourceHandler> resource_handler; | 91     scoped_refptr<ResourceHandler> resource_handler; | 
| 91 | 92 | 
| 92     // CrossSiteResourceHandler for this request, if it is a cross-site request. | 93     // CrossSiteResourceHandler for this request, if it is a cross-site request. | 
| 93     // (NULL otherwise.)  This handler is part of the chain of ResourceHandlers | 94     // (NULL otherwise.)  This handler is part of the chain of ResourceHandlers | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 128     net::LoadState last_load_state; | 129     net::LoadState last_load_state; | 
| 129 | 130 | 
| 130     uint64 upload_size; | 131     uint64 upload_size; | 
| 131 | 132 | 
| 132     uint64 last_upload_position; | 133     uint64 last_upload_position; | 
| 133 | 134 | 
| 134     base::TimeTicks last_upload_ticks; | 135     base::TimeTicks last_upload_ticks; | 
| 135 | 136 | 
| 136     bool waiting_for_upload_progress_ack; | 137     bool waiting_for_upload_progress_ack; | 
| 137 | 138 | 
|  | 139     // The approximate in-memory size (bytes) that we credited this request | 
|  | 140     // as consuming in |outstanding_requests_memory_cost_map_|. | 
|  | 141     int memory_cost; | 
|  | 142 | 
| 138    private: | 143    private: | 
| 139     // Request is temporarily not handling network data. Should be used only | 144     // Request is temporarily not handling network data. Should be used only | 
| 140     // by the ResourceDispatcherHost, not the event handlers. | 145     // by the ResourceDispatcherHost, not the event handlers. | 
| 141     bool is_paused; | 146     bool is_paused; | 
| 142 | 147 | 
| 143     // Whether this request has started reading any bytes from the response | 148     // Whether this request has started reading any bytes from the response | 
| 144     // yet.  Will be true after the first (unpaused) call to Read. | 149     // yet.  Will be true after the first (unpaused) call to Read. | 
| 145     bool has_started_reading; | 150     bool has_started_reading; | 
| 146 | 151 | 
| 147     // How many bytes have been read while this request has been paused. | 152     // How many bytes have been read while this request has been paused. | 
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 239   // case the caller should not send the data. | 244   // case the caller should not send the data. | 
| 240   bool WillSendData(int render_process_host_id, int request_id); | 245   bool WillSendData(int render_process_host_id, int request_id); | 
| 241 | 246 | 
| 242   // Pauses or resumes network activity for a particular request. | 247   // Pauses or resumes network activity for a particular request. | 
| 243   void PauseRequest(int render_process_host_id, int request_id, bool pause); | 248   void PauseRequest(int render_process_host_id, int request_id, bool pause); | 
| 244 | 249 | 
| 245   // Returns the number of pending requests. This is designed for the unittests | 250   // Returns the number of pending requests. This is designed for the unittests | 
| 246   int pending_requests() const { | 251   int pending_requests() const { | 
| 247     return static_cast<int>(pending_requests_.size()); | 252     return static_cast<int>(pending_requests_.size()); | 
| 248   } | 253   } | 
|  | 254 | 
|  | 255   // Intended for unit-tests only. Returns the memory cost of all the | 
|  | 256   // outstanding requests (pending and blocked) for |render_process_host_id|. | 
|  | 257   int GetOutstandingRequestsMemoryCost(int render_process_host_id) const; | 
|  | 258 | 
|  | 259   // Used by unit-tests to override the max outstanding requests constraint. | 
|  | 260   void set_max_outstanding_requests_cost_per_process(int limit) { | 
|  | 261     max_outstanding_requests_cost_per_process_ = limit; | 
|  | 262   } | 
|  | 263 | 
|  | 264   // The average private bytes increase of the browser for each new pending | 
|  | 265   // request. Experimentally obtained. | 
|  | 266   static const int kAvgBytesPerOutstandingRequest = 4400; | 
| 249 | 267 | 
| 250   DownloadFileManager* download_file_manager() const { | 268   DownloadFileManager* download_file_manager() const { | 
| 251     return download_file_manager_; | 269     return download_file_manager_; | 
| 252   } | 270   } | 
| 253 | 271 | 
| 254   DownloadRequestManager* download_request_manager() const { | 272   DownloadRequestManager* download_request_manager() const { | 
| 255     return download_request_manager_.get(); | 273     return download_request_manager_.get(); | 
| 256   } | 274   } | 
| 257 | 275 | 
| 258   SaveFileManager* save_file_manager() const { | 276   SaveFileManager* save_file_manager() const { | 
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 334   // Resumes any blocked request for the specified RenderView. | 352   // Resumes any blocked request for the specified RenderView. | 
| 335   void ResumeBlockedRequestsForRenderView(int render_process_host_id, | 353   void ResumeBlockedRequestsForRenderView(int render_process_host_id, | 
| 336                                           int render_view_id); | 354                                           int render_view_id); | 
| 337 | 355 | 
| 338   // Cancels any blocked request for the specified RenderView. | 356   // Cancels any blocked request for the specified RenderView. | 
| 339   void CancelBlockedRequestsForRenderView(int render_process_host_id, | 357   void CancelBlockedRequestsForRenderView(int render_process_host_id, | 
| 340                                           int render_view_id); | 358                                           int render_view_id); | 
| 341 | 359 | 
| 342  private: | 360  private: | 
| 343   FRIEND_TEST(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies); | 361   FRIEND_TEST(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies); | 
|  | 362   FRIEND_TEST(ResourceDispatcherHostTest, | 
|  | 363               IncrementOutstandingRequestsMemoryCost); | 
|  | 364   FRIEND_TEST(ResourceDispatcherHostTest, | 
|  | 365               CalculateApproximateMemoryCost); | 
|  | 366 | 
| 344   class ShutdownTask; | 367   class ShutdownTask; | 
| 345 | 368 | 
| 346   friend class ShutdownTask; | 369   friend class ShutdownTask; | 
| 347 | 370 | 
| 348   struct BlockedRequest { | 371   struct BlockedRequest { | 
| 349     BlockedRequest(URLRequest* url_request, bool mixed_content) | 372     BlockedRequest(URLRequest* url_request, bool mixed_content) | 
| 350         : url_request(url_request), | 373         : url_request(url_request), | 
| 351           mixed_content(mixed_content) { | 374           mixed_content(mixed_content) { | 
| 352     } | 375     } | 
| 353     URLRequest* url_request; | 376     URLRequest* url_request; | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 381   // renderer in the event of a download. If |allow_delete| is true and no IO | 404   // renderer in the event of a download. If |allow_delete| is true and no IO | 
| 382   // is pending, the request is removed and deleted. | 405   // is pending, the request is removed and deleted. | 
| 383   void CancelRequest(int render_process_host_id, | 406   void CancelRequest(int render_process_host_id, | 
| 384                      int request_id, | 407                      int request_id, | 
| 385                      bool from_renderer, | 408                      bool from_renderer, | 
| 386                      bool allow_delete); | 409                      bool allow_delete); | 
| 387 | 410 | 
| 388   // Helper function for regular and download requests. | 411   // Helper function for regular and download requests. | 
| 389   void BeginRequestInternal(URLRequest* request, bool mixed_content); | 412   void BeginRequestInternal(URLRequest* request, bool mixed_content); | 
| 390 | 413 | 
|  | 414   // Updates the "cost" of outstanding requests for |render_process_host_id|. | 
|  | 415   // The "cost" approximates how many bytes are consumed by all the in-memory | 
|  | 416   // data structures supporting this request (URLRequest object, | 
|  | 417   // HttpNetworkTransaction, etc...). | 
|  | 418   // The value of |cost| is added to the running total, and the resulting | 
|  | 419   // sum is returned. | 
|  | 420   int IncrementOutstandingRequestsMemoryCost(int cost, | 
|  | 421                                              int render_process_host_id); | 
|  | 422 | 
|  | 423   // Estimate how much heap space |request| will consume to run. | 
|  | 424   static int CalculateApproximateMemoryCost(URLRequest* request); | 
|  | 425 | 
| 391   // The list of all requests that we have pending. This list is not really | 426   // The list of all requests that we have pending. This list is not really | 
| 392   // optimized, and assumes that we have relatively few requests pending at once | 427   // optimized, and assumes that we have relatively few requests pending at once | 
| 393   // since some operations require brute-force searching of the list. | 428   // since some operations require brute-force searching of the list. | 
| 394   // | 429   // | 
| 395   // It may be enhanced in the future to provide some kind of prioritization | 430   // It may be enhanced in the future to provide some kind of prioritization | 
| 396   // mechanism. We should also consider a hashtable or binary tree if it turns | 431   // mechanism. We should also consider a hashtable or binary tree if it turns | 
| 397   // out we have a lot of things here. | 432   // out we have a lot of things here. | 
| 398   typedef std::map<GlobalRequestID,URLRequest*> PendingRequestList; | 433   typedef std::map<GlobalRequestID,URLRequest*> PendingRequestList; | 
| 399 | 434 | 
| 400   // Deletes the pending request identified by the iterator passed in. | 435   // Deletes the pending request identified by the iterator passed in. | 
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 470   ScopedRunnableMethodFactory<ResourceDispatcherHost> method_runner_; | 505   ScopedRunnableMethodFactory<ResourceDispatcherHost> method_runner_; | 
| 471 | 506 | 
| 472   // True if the resource dispatcher host has been shut down. | 507   // True if the resource dispatcher host has been shut down. | 
| 473   bool is_shutdown_; | 508   bool is_shutdown_; | 
| 474 | 509 | 
| 475   typedef std::vector<BlockedRequest> BlockedRequestsList; | 510   typedef std::vector<BlockedRequest> BlockedRequestsList; | 
| 476   typedef std::pair<int, int> ProcessRendererIDs; | 511   typedef std::pair<int, int> ProcessRendererIDs; | 
| 477   typedef std::map<ProcessRendererIDs, BlockedRequestsList*> BlockedRequestMap; | 512   typedef std::map<ProcessRendererIDs, BlockedRequestsList*> BlockedRequestMap; | 
| 478   BlockedRequestMap blocked_requests_map_; | 513   BlockedRequestMap blocked_requests_map_; | 
| 479 | 514 | 
|  | 515   // Maps the render_process_host_ids to the approximate number of bytes | 
|  | 516   // being used to service its resource requests. No entry implies 0 cost. | 
|  | 517   typedef std::map<int, int> OutstandingRequestsMemoryCostMap; | 
|  | 518   OutstandingRequestsMemoryCostMap outstanding_requests_memory_cost_map_; | 
|  | 519 | 
|  | 520   // |max_outstanding_requests_cost_per_process_| is the upper bound on how | 
|  | 521   // many outstanding requests can be issued per render process host. | 
|  | 522   // The constraint is expressed in terms of bytes (where the cost of | 
|  | 523   // individual requests is given by CalculateApproximateMemoryCost). | 
|  | 524   // The total number of outstanding requests is roughly: | 
|  | 525   //   (max_outstanding_requests_cost_per_process_ / | 
|  | 526   //       kAvgBytesPerOutstandingRequest) | 
|  | 527   int max_outstanding_requests_cost_per_process_; | 
|  | 528 | 
| 480   DISALLOW_COPY_AND_ASSIGN(ResourceDispatcherHost); | 529   DISALLOW_COPY_AND_ASSIGN(ResourceDispatcherHost); | 
| 481 }; | 530 }; | 
| 482 | 531 | 
| 483 #endif  // CHROME_BROWSER_RENDERER_HOST_RESOURCE_DISPATCHER_HOST_H_ | 532 #endif  // CHROME_BROWSER_RENDERER_HOST_RESOURCE_DISPATCHER_HOST_H_ | 
| OLD | NEW | 
|---|