Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // A ClientSocketPoolBase is used to restrict the number of sockets open at | 5 // A ClientSocketPoolBase is used to restrict the number of sockets open at |
| 6 // a time. It also maintains a list of idle persistent sockets for reuse. | 6 // a time. It also maintains a list of idle persistent sockets for reuse. |
| 7 // Subclasses of ClientSocketPool should compose ClientSocketPoolBase to handle | 7 // Subclasses of ClientSocketPool should compose ClientSocketPoolBase to handle |
| 8 // the core logic of (1) restricting the number of active (connected or | 8 // the core logic of (1) restricting the number of active (connected or |
| 9 // connecting) sockets per "group" (generally speaking, the hostname), (2) | 9 // connecting) sockets per "group" (generally speaking, the hostname), (2) |
| 10 // maintaining a per-group list of idle, persistent sockets for reuse, and (3) | 10 // maintaining a per-group list of idle, persistent sockets for reuse, and (3) |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 196 }; | 196 }; |
| 197 | 197 |
| 198 class ConnectJobFactory { | 198 class ConnectJobFactory { |
| 199 public: | 199 public: |
| 200 ConnectJobFactory() {} | 200 ConnectJobFactory() {} |
| 201 virtual ~ConnectJobFactory() {} | 201 virtual ~ConnectJobFactory() {} |
| 202 | 202 |
| 203 virtual scoped_ptr<ConnectJob> NewConnectJob( | 203 virtual scoped_ptr<ConnectJob> NewConnectJob( |
| 204 const std::string& group_name, | 204 const std::string& group_name, |
| 205 const Request& request, | 205 const Request& request, |
| 206 ConnectJob::Delegate* delegate) const = 0; | 206 ConnectJob::Delegate* delegate) = 0; |
|
wtc
2014/08/12 14:51:00
Why can't this method be const? I guess it's becau
mshelley
2014/08/12 21:47:00
Done.
| |
| 207 | 207 |
| 208 virtual base::TimeDelta ConnectionTimeout() const = 0; | 208 virtual base::TimeDelta ConnectionTimeout() const = 0; |
| 209 | 209 |
| 210 private: | 210 private: |
| 211 DISALLOW_COPY_AND_ASSIGN(ConnectJobFactory); | 211 DISALLOW_COPY_AND_ASSIGN(ConnectJobFactory); |
| 212 }; | 212 }; |
| 213 | 213 |
| 214 ClientSocketPoolBaseHelper( | 214 ClientSocketPoolBaseHelper( |
| 215 HigherLayeredPool* pool, | 215 HigherLayeredPool* pool, |
| 216 int max_sockets, | 216 int max_sockets, |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 284 int NumConnectJobsInGroup(const std::string& group_name) const { | 284 int NumConnectJobsInGroup(const std::string& group_name) const { |
| 285 return group_map_.find(group_name)->second->jobs().size(); | 285 return group_map_.find(group_name)->second->jobs().size(); |
| 286 } | 286 } |
| 287 | 287 |
| 288 int NumActiveSocketsInGroup(const std::string& group_name) const { | 288 int NumActiveSocketsInGroup(const std::string& group_name) const { |
| 289 return group_map_.find(group_name)->second->active_socket_count(); | 289 return group_map_.find(group_name)->second->active_socket_count(); |
| 290 } | 290 } |
| 291 | 291 |
| 292 bool HasGroup(const std::string& group_name) const; | 292 bool HasGroup(const std::string& group_name) const; |
| 293 | 293 |
| 294 void RemoveMessengersFromGroup(const std::string& group_name, | |
| 295 const std::string& cache_key) const; | |
|
Ryan Sleevi
2014/08/12 00:27:42
This feels like a layering violation. ClientSocket
mshelley
2014/08/12 21:47:00
Done.
| |
| 296 | |
| 294 // Called to enable/disable cleaning up idle sockets. When enabled, | 297 // Called to enable/disable cleaning up idle sockets. When enabled, |
| 295 // idle sockets that have been around for longer than a period defined | 298 // idle sockets that have been around for longer than a period defined |
| 296 // by kCleanupInterval are cleaned up using a timer. Otherwise they are | 299 // by kCleanupInterval are cleaned up using a timer. Otherwise they are |
| 297 // closed next time client makes a request. This may reduce network | 300 // closed next time client makes a request. This may reduce network |
| 298 // activity and power consumption. | 301 // activity and power consumption. |
| 299 static bool cleanup_timer_enabled(); | 302 static bool cleanup_timer_enabled(); |
| 300 static bool set_cleanup_timer_enabled(bool enabled); | 303 static bool set_cleanup_timer_enabled(bool enabled); |
| 301 | 304 |
| 302 // Closes all idle sockets if |force| is true. Else, only closes idle | 305 // Closes all idle sockets if |force| is true. Else, only closes idle |
| 303 // sockets that timed out or can't be reused. Made public for testing. | 306 // sockets that timed out or can't be reused. Made public for testing. |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 407 | 410 |
| 408 // If there's a ConnectJob that's never been assigned to Request, | 411 // If there's a ConnectJob that's never been assigned to Request, |
| 409 // decrements |unassigned_job_count_| and returns true. | 412 // decrements |unassigned_job_count_| and returns true. |
| 410 // Otherwise, returns false. | 413 // Otherwise, returns false. |
| 411 bool TryToUseUnassignedConnectJob(); | 414 bool TryToUseUnassignedConnectJob(); |
| 412 | 415 |
| 413 void AddJob(scoped_ptr<ConnectJob> job, bool is_preconnect); | 416 void AddJob(scoped_ptr<ConnectJob> job, bool is_preconnect); |
| 414 // Remove |job| from this group, which must already own |job|. | 417 // Remove |job| from this group, which must already own |job|. |
| 415 void RemoveJob(ConnectJob* job); | 418 void RemoveJob(ConnectJob* job); |
| 416 void RemoveAllJobs(); | 419 void RemoveAllJobs(); |
| 420 void RemoveMessengers(const std::string& cache_key); | |
| 417 | 421 |
| 418 bool has_pending_requests() const { | 422 bool has_pending_requests() const { |
| 419 return !pending_requests_.empty(); | 423 return !pending_requests_.empty(); |
| 420 } | 424 } |
| 421 | 425 |
| 422 size_t pending_request_count() const { | 426 size_t pending_request_count() const { |
| 423 return pending_requests_.size(); | 427 return pending_requests_.size(); |
| 424 } | 428 } |
| 425 | 429 |
| 426 // Gets (but does not remove) the next pending request. Returns | 430 // Gets (but does not remove) the next pending request. Returns |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 679 }; | 683 }; |
| 680 | 684 |
| 681 class ConnectJobFactory { | 685 class ConnectJobFactory { |
| 682 public: | 686 public: |
| 683 ConnectJobFactory() {} | 687 ConnectJobFactory() {} |
| 684 virtual ~ConnectJobFactory() {} | 688 virtual ~ConnectJobFactory() {} |
| 685 | 689 |
| 686 virtual scoped_ptr<ConnectJob> NewConnectJob( | 690 virtual scoped_ptr<ConnectJob> NewConnectJob( |
| 687 const std::string& group_name, | 691 const std::string& group_name, |
| 688 const Request& request, | 692 const Request& request, |
| 689 ConnectJob::Delegate* delegate) const = 0; | 693 ConnectJob::Delegate* delegate) = 0; |
| 690 | 694 |
| 691 virtual base::TimeDelta ConnectionTimeout() const = 0; | 695 virtual base::TimeDelta ConnectionTimeout() const = 0; |
| 692 | 696 |
| 693 private: | 697 private: |
| 694 DISALLOW_COPY_AND_ASSIGN(ConnectJobFactory); | 698 DISALLOW_COPY_AND_ASSIGN(ConnectJobFactory); |
| 695 }; | 699 }; |
| 696 | 700 |
| 697 // |max_sockets| is the maximum number of sockets to be maintained by this | 701 // |max_sockets| is the maximum number of sockets to be maintained by this |
| 698 // ClientSocketPool. |max_sockets_per_group| specifies the maximum number of | 702 // ClientSocketPool. |max_sockets_per_group| specifies the maximum number of |
| 699 // sockets a "group" can have. |unused_idle_socket_timeout| specifies how | 703 // sockets a "group" can have. |unused_idle_socket_timeout| specifies how |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 805 } | 809 } |
| 806 | 810 |
| 807 int NumActiveSocketsInGroup(const std::string& group_name) const { | 811 int NumActiveSocketsInGroup(const std::string& group_name) const { |
| 808 return helper_.NumActiveSocketsInGroup(group_name); | 812 return helper_.NumActiveSocketsInGroup(group_name); |
| 809 } | 813 } |
| 810 | 814 |
| 811 bool HasGroup(const std::string& group_name) const { | 815 bool HasGroup(const std::string& group_name) const { |
| 812 return helper_.HasGroup(group_name); | 816 return helper_.HasGroup(group_name); |
| 813 } | 817 } |
| 814 | 818 |
| 819 void RemoveMessengersFromGroup(const std::string& group_name, | |
| 820 const std::string& cache_key) const { | |
| 821 return helper_.RemoveMessengersFromGroup(group_name, cache_key); | |
| 822 } | |
| 823 | |
| 815 void CleanupIdleSockets(bool force) { | 824 void CleanupIdleSockets(bool force) { |
| 816 return helper_.CleanupIdleSockets(force); | 825 return helper_.CleanupIdleSockets(force); |
| 817 } | 826 } |
| 818 | 827 |
| 819 base::DictionaryValue* GetInfoAsValue(const std::string& name, | 828 base::DictionaryValue* GetInfoAsValue(const std::string& name, |
| 820 const std::string& type) const { | 829 const std::string& type) const { |
| 821 return helper_.GetInfoAsValue(name, type); | 830 return helper_.GetInfoAsValue(name, type); |
| 822 } | 831 } |
| 823 | 832 |
| 824 base::TimeDelta ConnectionTimeout() const { | 833 base::TimeDelta ConnectionTimeout() const { |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 849 typedef typename ClientSocketPoolBase<SocketParams>::ConnectJobFactory | 858 typedef typename ClientSocketPoolBase<SocketParams>::ConnectJobFactory |
| 850 ConnectJobFactory; | 859 ConnectJobFactory; |
| 851 | 860 |
| 852 explicit ConnectJobFactoryAdaptor(ConnectJobFactory* connect_job_factory) | 861 explicit ConnectJobFactoryAdaptor(ConnectJobFactory* connect_job_factory) |
| 853 : connect_job_factory_(connect_job_factory) {} | 862 : connect_job_factory_(connect_job_factory) {} |
| 854 virtual ~ConnectJobFactoryAdaptor() {} | 863 virtual ~ConnectJobFactoryAdaptor() {} |
| 855 | 864 |
| 856 virtual scoped_ptr<ConnectJob> NewConnectJob( | 865 virtual scoped_ptr<ConnectJob> NewConnectJob( |
| 857 const std::string& group_name, | 866 const std::string& group_name, |
| 858 const internal::ClientSocketPoolBaseHelper::Request& request, | 867 const internal::ClientSocketPoolBaseHelper::Request& request, |
| 859 ConnectJob::Delegate* delegate) const OVERRIDE { | 868 ConnectJob::Delegate* delegate) OVERRIDE { |
| 860 const Request& casted_request = static_cast<const Request&>(request); | 869 const Request& casted_request = static_cast<const Request&>(request); |
| 861 return connect_job_factory_->NewConnectJob( | 870 return connect_job_factory_->NewConnectJob( |
| 862 group_name, casted_request, delegate); | 871 group_name, casted_request, delegate); |
| 863 } | 872 } |
| 864 | 873 |
| 865 virtual base::TimeDelta ConnectionTimeout() const { | 874 virtual base::TimeDelta ConnectionTimeout() const { |
| 866 return connect_job_factory_->ConnectionTimeout(); | 875 return connect_job_factory_->ConnectionTimeout(); |
| 867 } | 876 } |
| 868 | 877 |
| 869 const scoped_ptr<ConnectJobFactory> connect_job_factory_; | 878 const scoped_ptr<ConnectJobFactory> connect_job_factory_; |
| 870 }; | 879 }; |
| 871 | 880 |
| 872 // Histograms for the pool | 881 // Histograms for the pool |
| 873 ClientSocketPoolHistograms* const histograms_; | 882 ClientSocketPoolHistograms* const histograms_; |
| 874 internal::ClientSocketPoolBaseHelper helper_; | 883 internal::ClientSocketPoolBaseHelper helper_; |
| 875 | 884 |
| 876 DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBase); | 885 DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBase); |
| 877 }; | 886 }; |
| 878 | 887 |
| 879 } // namespace net | 888 } // namespace net |
| 880 | 889 |
| 881 #endif // NET_SOCKET_CLIENT_SOCKET_POOL_BASE_H_ | 890 #endif // NET_SOCKET_CLIENT_SOCKET_POOL_BASE_H_ |
| OLD | NEW |