| Index: net/socket/client_socket_pool_base.h | 
| =================================================================== | 
| --- net/socket/client_socket_pool_base.h	(revision 219027) | 
| +++ net/socket/client_socket_pool_base.h	(working copy) | 
| @@ -204,6 +204,7 @@ | 
| }; | 
|  | 
| ClientSocketPoolBaseHelper( | 
| +      HigherLayeredPool* pool, | 
| int max_sockets, | 
| int max_sockets_per_group, | 
| base::TimeDelta unused_idle_socket_timeout, | 
| @@ -212,11 +213,18 @@ | 
|  | 
| 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); | 
| +  // Adds a lower layered pool to |this|, and adds |this| as a higher layered | 
| +  // pool on top of |lower_pool|. | 
| +  void AddLowerLayeredPool(LowerLayeredPool* lower_pool); | 
|  | 
| +  // See LowerLayeredPool::IsStalled for documentation on this function. | 
| +  bool IsStalled() const; | 
| + | 
| +  // See LowerLayeredPool for documentation on these functions. It is expected | 
| +  // in the destructor that no higher layer pools remain. | 
| +  void AddHigherLayeredPool(HigherLayeredPool* higher_pool); | 
| +  void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool); | 
| + | 
| // See ClientSocketPool::RequestSocket for documentation on this function. | 
| // ClientSocketPoolBaseHelper takes ownership of |request|, which must be | 
| // heap allocated. | 
| @@ -239,9 +247,6 @@ | 
| // See ClientSocketPool::FlushWithError for documentation on this function. | 
| void FlushWithError(int error); | 
|  | 
| -  // See ClientSocketPool::IsStalled for documentation on this function. | 
| -  bool IsStalled() const; | 
| - | 
| // See ClientSocketPool::CloseIdleSockets for documentation on this function. | 
| void CloseIdleSockets(); | 
|  | 
| @@ -298,8 +303,8 @@ | 
| // I'm not sure if we hit this situation often. | 
| bool CloseOneIdleSocket(); | 
|  | 
| -  // Checks layered pools to see if they can close an idle connection. | 
| -  bool CloseOneIdleConnectionInLayeredPool(); | 
| +  // Checks higher layered pools to see if they can close an idle connection. | 
| +  bool CloseOneIdleConnectionInHigherLayeredPool(); | 
|  | 
| // See ClientSocketPool::GetInfoAsValue for documentation on this function. | 
| base::DictionaryValue* GetInfoAsValue(const std::string& name, | 
| @@ -593,8 +598,19 @@ | 
| // to the pool, we can make sure that they are discarded rather than reused. | 
| int pool_generation_number_; | 
|  | 
| -  std::set<LayeredPool*> higher_layer_pools_; | 
| +  // Used to add |this| as a higher layer pool on top of lower layer pools.  May | 
| +  // be NULL if no lower layer pools will be added. | 
| +  HigherLayeredPool* pool_; | 
|  | 
| +  // Pools that create connections through |this|.  |this| will try to close | 
| +  // their idle sockets when it stalls.  Must be empty on destruction. | 
| +  std::set<HigherLayeredPool*> higher_pools_; | 
| + | 
| +  // Pools that this goes through.  Typically there's only one, but not always. | 
| +  // |this| will check if they're stalled when it has a new idle socket.  |this| | 
| +  // will remove itself from all lower layered pools on destruction. | 
| +  std::set<LowerLayeredPool*> lower_pools_; | 
| + | 
| base::WeakPtrFactory<ClientSocketPoolBaseHelper> weak_factory_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBaseHelper); | 
| @@ -647,6 +663,7 @@ | 
| // |used_idle_socket_timeout| specifies how long to leave a previously used | 
| // idle socket open before closing it. | 
| ClientSocketPoolBase( | 
| +      HigherLayeredPool* self, | 
| int max_sockets, | 
| int max_sockets_per_group, | 
| ClientSocketPoolHistograms* histograms, | 
| @@ -654,21 +671,25 @@ | 
| base::TimeDelta used_idle_socket_timeout, | 
| ConnectJobFactory* connect_job_factory) | 
| : histograms_(histograms), | 
| -        helper_(max_sockets, max_sockets_per_group, | 
| +        helper_(self, max_sockets, max_sockets_per_group, | 
| unused_idle_socket_timeout, used_idle_socket_timeout, | 
| new ConnectJobFactoryAdaptor(connect_job_factory)) {} | 
|  | 
| virtual ~ClientSocketPoolBase() {} | 
|  | 
| // These member functions simply forward to ClientSocketPoolBaseHelper. | 
| -  void AddLayeredPool(LayeredPool* pool) { | 
| -    helper_.AddLayeredPool(pool); | 
| +  void AddLowerLayeredPool(LowerLayeredPool* lower_pool) { | 
| +    helper_.AddLowerLayeredPool(lower_pool); | 
| } | 
|  | 
| -  void RemoveLayeredPool(LayeredPool* pool) { | 
| -    helper_.RemoveLayeredPool(pool); | 
| +  void AddHigherLayeredPool(HigherLayeredPool* higher_pool) { | 
| +    helper_.AddHigherLayeredPool(higher_pool); | 
| } | 
|  | 
| +  void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) { | 
| +    helper_.RemoveHigherLayeredPool(higher_pool); | 
| +  } | 
| + | 
| // RequestSocket bundles up the parameters into a Request and then forwards to | 
| // ClientSocketPoolBaseHelper::RequestSocket(). | 
| int RequestSocket(const std::string& group_name, | 
| @@ -771,8 +792,8 @@ | 
|  | 
| bool CloseOneIdleSocket() { return helper_.CloseOneIdleSocket(); } | 
|  | 
| -  bool CloseOneIdleConnectionInLayeredPool() { | 
| -    return helper_.CloseOneIdleConnectionInLayeredPool(); | 
| +  bool CloseOneIdleConnectionInHigherLayeredPool() { | 
| +    return helper_.CloseOneIdleConnectionInHigherLayeredPool(); | 
| } | 
|  | 
| private: | 
|  |