| Index: net/base/client_socket_pool.h
|
| diff --git a/net/base/client_socket_pool.h b/net/base/client_socket_pool.h
|
| index 2e93a00dd67c3d11ed9b03abbf71da53eb984eb4..6c92f37ac0d6c35f9ba2213eb727469c1a8b51e9 100644
|
| --- a/net/base/client_socket_pool.h
|
| +++ b/net/base/client_socket_pool.h
|
| @@ -12,66 +12,58 @@
|
| #include "base/ref_counted.h"
|
| #include "base/scoped_ptr.h"
|
| #include "base/timer.h"
|
| -#include "net/base/address_list.h"
|
| #include "net/base/completion_callback.h"
|
| -#include "net/base/host_resolver.h"
|
| -#include "net/base/load_states.h"
|
|
|
| namespace net {
|
|
|
| class ClientSocket;
|
| -class ClientSocketFactory;
|
| class ClientSocketHandle;
|
|
|
| // A ClientSocketPool is used to restrict the number of sockets open at a time.
|
| // It also maintains a list of idle persistent sockets.
|
| //
|
| +// The ClientSocketPool allocates scoped_ptr<ClientSocket> objects, but it is
|
| +// not responsible for allocating the associated ClientSocket objects. The
|
| +// consumer must do so if it gets a scoped_ptr<ClientSocket> with a null value.
|
| +//
|
| class ClientSocketPool : public base::RefCounted<ClientSocketPool> {
|
| public:
|
| - ClientSocketPool(int max_sockets_per_group,
|
| - ClientSocketFactory* client_socket_factory);
|
| -
|
| - // Requests a connected socket for a group_name.
|
| - //
|
| - // There are four possible results from calling this function:
|
| - // 1) RequestSocket returns OK and initializes |handle| with a reused socket.
|
| - // 2) RequestSocket returns OK with a newly connected socket.
|
| - // 3) RequestSocket returns ERR_IO_PENDING. The handle will be added to a
|
| - // wait list until a socket is available to reuse or a new socket finishes
|
| - // connecting. |priority| will determine the placement into the wait list.
|
| - // 4) An error occurred early on, so RequestSocket returns an error code.
|
| + explicit ClientSocketPool(int max_sockets_per_group);
|
| +
|
| + // Called to request a socket for the given handle. There are three possible
|
| + // results: 1) the handle will be initialized with a socket to reuse, 2) the
|
| + // handle will be initialized without a socket such that the consumer needs
|
| + // to supply a socket, or 3) the handle will be added to a wait list until a
|
| + // socket is available to reuse or the opportunity to create a new socket
|
| + // arises. The completion callback is notified in the 3rd case. |priority|
|
| + // will determine the placement into the wait list.
|
| //
|
| // If this function returns OK, then |handle| is initialized upon return.
|
| // The |handle|'s is_initialized method will return true in this case. If a
|
| - // ClientSocket was reused, then ClientSocketPool will call
|
| - // |handle|->set_reused(true). In either case, the socket will have been
|
| - // allocated and will be connected. A client might want to know whether or
|
| - // not the socket is reused in order to know whether or not he needs to
|
| - // perform SSL connection or tunnel setup or to request a new socket if he
|
| - // encounters an error with the reused socket.
|
| + // ClientSocket was reused, then |handle|'s socket member will be non-NULL.
|
| + // Otherwise, the consumer will need to supply |handle| with a socket by
|
| + // allocating a new ClientSocket object and calling the |handle|'s set_socket
|
| + // method.
|
| //
|
| - // If ERR_IO_PENDING is returned, then the callback will be used to notify the
|
| - // client of completion.
|
| + // If ERR_IO_PENDING is returned, then the completion callback will be called
|
| + // when |handle| has been initialized.
|
| //
|
| - int RequestSocket(const std::string& group_name,
|
| - const std::string& host,
|
| - int port,
|
| + int RequestSocket(ClientSocketHandle* handle,
|
| int priority,
|
| - ClientSocketHandle* handle,
|
| CompletionCallback* callback);
|
|
|
| // Called to cancel a RequestSocket call that returned ERR_IO_PENDING. The
|
| // same handle parameter must be passed to this method as was passed to the
|
| // RequestSocket call being cancelled. The associated CompletionCallback is
|
| // not run.
|
| - void CancelRequest(const std::string& group_name,
|
| - const ClientSocketHandle* handle);
|
| + void CancelRequest(ClientSocketHandle* handle);
|
|
|
| - // Called to release a socket once the socket is no longer needed. If the
|
| - // socket still has an established connection, then it will be added to the
|
| - // set of idle sockets to be used to satisfy future RequestSocket calls.
|
| - // Otherwise, the ClientSocket is destroyed.
|
| - void ReleaseSocket(const std::string& group_name, ClientSocket* socket);
|
| + // Called to release the socket member of an initialized ClientSocketHandle
|
| + // once the socket is no longer needed. If the socket member is non-null and
|
| + // still has an established connection, then it will be added to the idle set
|
| + // of sockets to be used to satisfy future RequestSocket calls. Otherwise,
|
| + // the ClientSocket is destroyed.
|
| + void ReleaseSocket(ClientSocketHandle* handle);
|
|
|
| // Called to close any idle connections held by the connection manager.
|
| void CloseIdleSockets();
|
| @@ -84,27 +76,22 @@ class ClientSocketPool : public base::RefCounted<ClientSocketPool> {
|
| // The total number of idle sockets in a connection group.
|
| int IdleSocketCountInGroup(const std::string& group_name) const;
|
|
|
| - // Determine the LoadState of a connecting ClientSocketHandle.
|
| - LoadState GetLoadState(const std::string& group_name,
|
| - const ClientSocketHandle* handle) const;
|
| -
|
| private:
|
| friend class base::RefCounted<ClientSocketPool>;
|
|
|
| + typedef scoped_ptr<ClientSocket> ClientSocketPtr;
|
| +
|
| // A Request is allocated per call to RequestSocket that results in
|
| // ERR_IO_PENDING.
|
| struct Request {
|
| ClientSocketHandle* handle;
|
| CompletionCallback* callback;
|
| int priority;
|
| - std::string host;
|
| - int port;
|
| - LoadState load_state;
|
| };
|
|
|
| // Entry for a persistent socket which became idle at time |start_time|.
|
| struct IdleSocket {
|
| - ClientSocket* socket;
|
| + ClientSocketPtr* ptr;
|
| base::TimeTicks start_time;
|
|
|
| // An idle socket should be removed if it can't be reused, or has been idle
|
| @@ -118,7 +105,6 @@ class ClientSocketPool : public base::RefCounted<ClientSocketPool> {
|
| };
|
|
|
| typedef std::deque<Request> RequestQueue;
|
| - typedef std::map<const ClientSocketHandle*, Request> RequestMap;
|
|
|
| // A Group is allocated per group_name when there are idle sockets or pending
|
| // requests. Otherwise, the Group object is removed from the map.
|
| @@ -126,57 +112,11 @@ class ClientSocketPool : public base::RefCounted<ClientSocketPool> {
|
| Group() : active_socket_count(0) {}
|
| std::deque<IdleSocket> idle_sockets;
|
| RequestQueue pending_requests;
|
| - RequestMap connecting_requests;
|
| int active_socket_count;
|
| };
|
|
|
| typedef std::map<std::string, Group> GroupMap;
|
|
|
| - // ConnectingSocket handles the host resolution necessary for socket creation
|
| - // and the Connect().
|
| - class ConnectingSocket {
|
| - public:
|
| - enum State {
|
| - STATE_RESOLVE_HOST,
|
| - STATE_CONNECT
|
| - };
|
| -
|
| - ConnectingSocket(const std::string& group_name,
|
| - const ClientSocketHandle* handle,
|
| - ClientSocketFactory* client_socket_factory,
|
| - ClientSocketPool* pool);
|
| - ~ConnectingSocket();
|
| -
|
| - // Begins the host resolution and the TCP connect. Returns OK on success,
|
| - // in which case |callback| is not called. On pending IO, Connect returns
|
| - // ERR_IO_PENDING and runs |callback| on completion.
|
| - int Connect(const std::string& host,
|
| - int port,
|
| - CompletionCallback* callback);
|
| -
|
| - // If Connect() returns OK, ClientSocketPool may invoke this method to get
|
| - // the ConnectingSocket to release |socket_| to be set into the
|
| - // ClientSocketHandle immediately.
|
| - ClientSocket* ReleaseSocket();
|
| -
|
| - private:
|
| - void OnIOComplete(int result);
|
| -
|
| - const std::string group_name_;
|
| - const ClientSocketHandle* const handle_;
|
| - ClientSocketFactory* const client_socket_factory_;
|
| - CompletionCallbackImpl<ConnectingSocket> callback_;
|
| - scoped_ptr<ClientSocket> socket_;
|
| - scoped_refptr<ClientSocketPool> pool_;
|
| - HostResolver resolver_;
|
| - AddressList addresses_;
|
| -
|
| - // The time the Connect() method was called (if it got called).
|
| - base::Time connect_start_time_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ConnectingSocket);
|
| - };
|
| -
|
| ~ClientSocketPool();
|
|
|
| static void InsertRequestIntoQueue(const Request& r,
|
| @@ -191,7 +131,7 @@ class ClientSocketPool : public base::RefCounted<ClientSocketPool> {
|
| void DecrementIdleCount();
|
|
|
| // Called via PostTask by ReleaseSocket.
|
| - void DoReleaseSocket(const std::string& group_name, ClientSocket* socket);
|
| + void DoReleaseSocket(const std::string& group_name, ClientSocketPtr* ptr);
|
|
|
| // Called when timer_ fires. This method scans the idle sockets removing
|
| // sockets that timed out or can't be reused.
|
| @@ -199,8 +139,6 @@ class ClientSocketPool : public base::RefCounted<ClientSocketPool> {
|
| CleanupIdleSockets(false);
|
| }
|
|
|
| - ClientSocketFactory* const client_socket_factory_;
|
| -
|
| GroupMap group_map_;
|
|
|
| // Timer used to periodically prune idle sockets that timed out or can't be
|
| @@ -211,7 +149,7 @@ class ClientSocketPool : public base::RefCounted<ClientSocketPool> {
|
| int idle_socket_count_;
|
|
|
| // The maximum number of sockets kept per group.
|
| - const int max_sockets_per_group_;
|
| + int max_sockets_per_group_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(ClientSocketPool);
|
| };
|
|
|