| Index: net/socket/client_socket_pool_base.h
 | 
| ===================================================================
 | 
| --- net/socket/client_socket_pool_base.h	(revision 113254)
 | 
| +++ net/socket/client_socket_pool_base.h	(working copy)
 | 
| @@ -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 @@
 | 
|  
 | 
|    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 @@
 | 
|    // 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();
 | 
|  
 | 
| @@ -305,6 +314,16 @@
 | 
|    // 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();
 | 
| +
 | 
| +  // Checks layered pools to see if they can close an idle connection.
 | 
| +  bool CloseOneIdleConnectionInLayeredPool();
 | 
| +
 | 
|    // See ClientSocketPool::GetInfoAsValue for documentation on this function.
 | 
|    base::DictionaryValue* GetInfoAsValue(const std::string& name,
 | 
|                                          const std::string& type) const;
 | 
| @@ -457,7 +476,7 @@
 | 
|    // 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.
 | 
| @@ -509,13 +528,6 @@
 | 
|    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.
 | 
| @@ -580,6 +592,8 @@
 | 
|    // 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);
 | 
| @@ -646,7 +660,14 @@
 | 
|    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().
 | 
|    int RequestSocket(const std::string& group_name,
 | 
| @@ -690,6 +711,10 @@
 | 
|      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(); }
 | 
| @@ -738,8 +763,12 @@
 | 
|  
 | 
|    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
 | 
|    // internal::ClientSocketPoolBaseHelper::ConnectJobFactory and
 | 
| 
 |