Index: net/socket/client_socket_pool_base.h |
diff --git a/net/socket/client_socket_pool_base.h b/net/socket/client_socket_pool_base.h |
index 9e46e5eabd885c7f9c541b7b5b8b760ad2ddecf8..2e4a6a19dc5e91e4c58bfa0b2e91c92d84cd0938 100644 |
--- a/net/socket/client_socket_pool_base.h |
+++ b/net/socket/client_socket_pool_base.h |
@@ -28,6 +28,7 @@ |
#include <map> |
#include <set> |
#include <string> |
+#include <vector> |
#include "base/basictypes.h" |
#include "base/memory/ref_counted.h" |
@@ -239,6 +240,11 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper |
virtual ~ClientSocketPoolBaseHelper(); |
+ // Adds/Removes layered pools. It is expected in the destructor that no |
+ // layered pools remain. |
+ void AddLayeredPool(LayeredPool* pool); |
+ void RemoveLayeredPool(LayeredPool* pool); |
+ |
// See ClientSocketPool::RequestSocket for documentation on this function. |
// ClientSocketPoolBaseHelper takes ownership of |request|, which must be |
// heap allocated. |
@@ -261,6 +267,9 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper |
// See ClientSocketPool::Flush for documentation on this function. |
void Flush(); |
+ // See ClientSocketPool::IsStalled for documentation on this function. |
+ bool IsStalled() const; |
+ |
// See ClientSocketPool::CloseIdleSockets for documentation on this function. |
void CloseIdleSockets(); |
@@ -297,6 +306,13 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper |
// sockets that timed out or can't be reused. Made public for testing. |
void CleanupIdleSockets(bool force); |
+ // Closes one idle socket. Picks the first one encountered. |
+ // TODO(willchan): Consider a better algorithm for doing this. Perhaps we |
+ // should keep an ordered list of idle sockets, and close them in order. |
+ // Requires maintaining more state. It's not clear if it's worth it since |
+ // I'm not sure if we hit this situation often. |
+ bool CloseOneIdleSocket(); |
+ |
// See ClientSocketPool::GetInfoAsValue for documentation on this function. |
base::DictionaryValue* GetInfoAsValue(const std::string& name, |
const std::string& type) const; |
@@ -313,6 +329,9 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper |
// ConnectJob::Delegate methods: |
virtual void OnConnectJobComplete(int result, ConnectJob* job); |
+ // Checks layered pools to see if they can close an idle connection. |
+ bool CloseOneIdleConnectionInLayeredPool(); |
+ |
// NetworkChangeNotifier::IPAddressObserver methods: |
virtual void OnIPAddressChanged(); |
@@ -446,7 +465,7 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper |
// at least one pending request. Returns true if any groups are stalled, and |
// if so, fills |group| and |group_name| with data of the stalled group |
// having highest priority. |
- bool FindTopStalledGroup(Group** group, std::string* group_name); |
+ bool FindTopStalledGroup(Group** group, std::string* group_name) const; |
// Called when timer_ fires. This method scans the idle sockets removing |
// sockets that timed out or can't be reused. |
@@ -498,13 +517,6 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper |
static void LogBoundConnectJobToRequest( |
const NetLog::Source& connect_job_source, const Request* request); |
- // Closes one idle socket. Picks the first one encountered. |
- // TODO(willchan): Consider a better algorithm for doing this. Perhaps we |
- // should keep an ordered list of idle sockets, and close them in order. |
- // Requires maintaining more state. It's not clear if it's worth it since |
- // I'm not sure if we hit this situation often. |
- void CloseOneIdleSocket(); |
- |
// Same as CloseOneIdleSocket() except it won't close an idle socket in |
// |group|. If |group| is NULL, it is ignored. Returns true if it closed a |
// socket. |
@@ -566,6 +578,8 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper |
// make sure that they are discarded rather than reused. |
int pool_generation_number_; |
+ std::set<LayeredPool*> higher_layer_pools_; |
+ |
ScopedRunnableMethodFactory<ClientSocketPoolBaseHelper> method_factory_; |
DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBaseHelper); |
@@ -632,6 +646,13 @@ class ClientSocketPoolBase { |
virtual ~ClientSocketPoolBase() {} |
// These member functions simply forward to ClientSocketPoolBaseHelper. |
+ void AddLayeredPool(LayeredPool* pool) { |
+ helper_.AddLayeredPool(pool); |
+ } |
+ |
+ void RemoveLayeredPool(LayeredPool* pool) { |
+ helper_.RemoveLayeredPool(pool); |
+ } |
// RequestSocket bundles up the parameters into a Request and then forwards to |
// ClientSocketPoolBaseHelper::RequestSocket(). |
@@ -676,6 +697,10 @@ class ClientSocketPoolBase { |
return helper_.ReleaseSocket(group_name, socket, id); |
} |
+ void Flush() { helper_.Flush(); } |
+ |
+ bool IsStalled() const { return helper_.IsStalled(); } |
+ |
void CloseIdleSockets() { return helper_.CloseIdleSockets(); } |
int idle_socket_count() const { return helper_.idle_socket_count(); } |
@@ -724,7 +749,11 @@ class ClientSocketPoolBase { |
void EnableConnectBackupJobs() { helper_.EnableConnectBackupJobs(); } |
- void Flush() { helper_.Flush(); } |
+ bool CloseOneIdleSocket() { return helper_.CloseOneIdleSocket(); } |
+ |
+ bool CloseOneIdleConnectionInLayeredPool() { |
+ return helper_.CloseOneIdleConnectionInLayeredPool(); |
+ } |
private: |
// This adaptor class exists to bridge the |