diff options
author | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-29 20:26:13 +0000 |
---|---|---|
committer | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-29 20:26:13 +0000 |
commit | 2431756ea7ceea7ac837522d948c3628cf83b647 (patch) | |
tree | 89e8921ce9f257f2dfeeb2491fb0ea246d4d1050 /net/http/http_network_session.cc | |
parent | 252c50a4cdb5a9506938b231f4bd19afd5365757 (diff) | |
download | chromium_src-2431756ea7ceea7ac837522d948c3628cf83b647.zip chromium_src-2431756ea7ceea7ac837522d948c3628cf83b647.tar.gz chromium_src-2431756ea7ceea7ac837522d948c3628cf83b647.tar.bz2 |
Stop refcounting ClientSocketPool.
Establishes that HttpNetworkSession owns all the socket pools.
Move out all the socket pools into a ClientSocketPoolManager. This is because
of the dependency tree amongst socket pools, which dictates the order in which
they must be constructed and destructed. In order to better establish it, I
moved them out to their own class. HttpNetworkSession owns the
ClientSocketPoolManager which owns the pools. We pass the pools as raw
pointers everywhere.
Note that ClientSocketPoolManager owns more pools than are publicly accessible via its interface. That's because some of them are wrapped by publicly exposed pools.
Also, ClientSocketPoolHistograms used to be reference counted. That's because it can be shared by multiple ClientSocketPools. But it's effectively a global as well, so I make their lifetimes persist for the length of ClientSocketPoolManager too.
I also removed internal refcounting in ClientSocketPoolBase. I had refcounted
it before I knew about ScopedRunnableMethodFactory back when I first started.
I cleaned up the unit tests a lot. Back when I was a young padawan, I didn't
really know what I was doing, so I copy/pasted a metric asston of code. Turns
out most of it was stupid, so I fixed it. I also stopped the use of
implementation inheritance with ClientSocketPoolTest because it's discouraged
by the style guide and more importantly because it caused the
ClientSocketHandles within the TestSocketRequest vector to be destroyed _after_
the pools themselves were destroyed, which is bad since the handles will call
pool_->Release() which blows up.
BUG=56215,56215
TEST=Existing unit tests
Review URL: http://codereview.chromium.org/3389020
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@60983 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/http/http_network_session.cc')
-rw-r--r-- | net/http/http_network_session.cc | 186 |
1 files changed, 7 insertions, 179 deletions
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc index 851956e..7b4fe0e 100644 --- a/net/http/http_network_session.cc +++ b/net/http/http_network_session.cc @@ -17,38 +17,6 @@ namespace net { -namespace { - -// Total limit of sockets. -int g_max_sockets = 256; - -// Default to allow up to 6 connections per host. Experiment and tuning may -// try other values (greater than 0). Too large may cause many problems, such -// as home routers blocking the connections!?!? See http://crbug.com/12066. -int g_max_sockets_per_group = 6; - -// The max number of sockets to allow per proxy server. This applies both to -// http and SOCKS proxies. See http://crbug.com/12066 and -// http://crbug.com/44501 for details about proxy server connection limits. -int g_max_sockets_per_proxy_server = 32; - -// Appends information about all |socket_pools| to the end of |list|. -template <class MapType> -static void AddSocketPoolsToList(ListValue* list, - const MapType& socket_pools, - const std::string& type, - bool include_nested_pools) { - typename MapType::const_iterator socket_pool_it = socket_pools.begin(); - for (typename MapType::const_iterator it = socket_pools.begin(); - it != socket_pools.end(); it++) { - list->Append(it->second->GetInfoAsValue(it->first.ToString(), - type, - include_nested_pools)); - } -} - -} // namespace - // TODO(mbelshe): Move the socket factories into HttpStreamFactory. HttpNetworkSession::HttpNetworkSession( HostResolver* host_resolver, @@ -59,29 +27,15 @@ HttpNetworkSession::HttpNetworkSession( HttpAuthHandlerFactory* http_auth_handler_factory, HttpNetworkDelegate* network_delegate, NetLog* net_log) - : tcp_pool_histograms_(new ClientSocketPoolHistograms("TCP")), - tcp_for_http_proxy_pool_histograms_( - new ClientSocketPoolHistograms("TCPforHTTPProxy")), - http_proxy_pool_histograms_(new ClientSocketPoolHistograms("HTTPProxy")), - tcp_for_https_proxy_pool_histograms_( - new ClientSocketPoolHistograms("TCPforHTTPSProxy")), - ssl_for_https_proxy_pool_histograms_( - new ClientSocketPoolHistograms("SSLforHTTPSProxy")), - tcp_for_socks_pool_histograms_( - new ClientSocketPoolHistograms("TCPforSOCKS")), - socks_pool_histograms_(new ClientSocketPoolHistograms("SOCK")), - ssl_pool_histograms_(new ClientSocketPoolHistograms("SSL")), - tcp_socket_pool_(new TCPClientSocketPool( - g_max_sockets, g_max_sockets_per_group, tcp_pool_histograms_, - host_resolver, client_socket_factory, net_log)), - ssl_socket_pool_(new SSLClientSocketPool( - g_max_sockets, g_max_sockets_per_group, ssl_pool_histograms_, - host_resolver, client_socket_factory, tcp_socket_pool_, NULL, - NULL, ssl_config_service, net_log)), - socket_factory_(client_socket_factory), + : socket_factory_(client_socket_factory), host_resolver_(host_resolver), proxy_service_(proxy_service), ssl_config_service_(ssl_config_service), + socket_pool_manager_(net_log, + client_socket_factory, + host_resolver, + proxy_service, + ssl_config_service), spdy_session_pool_(spdy_session_pool), http_stream_factory_(new HttpStreamFactory()), http_auth_handler_factory_(http_auth_handler_factory), @@ -93,6 +47,7 @@ HttpNetworkSession::HttpNetworkSession( HttpNetworkSession::~HttpNetworkSession() { STLDeleteElements(&response_drainers_); + spdy_session_pool_->CloseAllSessions(); } void HttpNetworkSession::AddResponseDrainer(HttpResponseBodyDrainer* drainer) { @@ -106,131 +61,4 @@ void HttpNetworkSession::RemoveResponseDrainer( response_drainers_.erase(drainer); } -const scoped_refptr<HttpProxyClientSocketPool>& -HttpNetworkSession::GetSocketPoolForHTTPProxy(const HostPortPair& http_proxy) { - HTTPProxySocketPoolMap::const_iterator it = - http_proxy_socket_pools_.find(http_proxy); - if (it != http_proxy_socket_pools_.end()) - return it->second; - - std::pair<HTTPProxySocketPoolMap::iterator, bool> ret = - http_proxy_socket_pools_.insert( - std::make_pair( - http_proxy, - new HttpProxyClientSocketPool( - g_max_sockets_per_proxy_server, g_max_sockets_per_group, - http_proxy_pool_histograms_, host_resolver_, - new TCPClientSocketPool( - g_max_sockets_per_proxy_server, g_max_sockets_per_group, - tcp_for_http_proxy_pool_histograms_, host_resolver_, - socket_factory_, net_log_), - new SSLClientSocketPool( - g_max_sockets_per_proxy_server, g_max_sockets_per_group, - ssl_for_https_proxy_pool_histograms_, host_resolver_, - socket_factory_, - new TCPClientSocketPool( - g_max_sockets_per_proxy_server, - g_max_sockets_per_group, - tcp_for_https_proxy_pool_histograms_, host_resolver_, - socket_factory_, net_log_), - NULL, NULL, ssl_config_service_, net_log_), - net_log_))); - - return ret.first->second; -} - -const scoped_refptr<SOCKSClientSocketPool>& -HttpNetworkSession::GetSocketPoolForSOCKSProxy( - const HostPortPair& socks_proxy) { - SOCKSSocketPoolMap::const_iterator it = socks_socket_pools_.find(socks_proxy); - if (it != socks_socket_pools_.end()) - return it->second; - - std::pair<SOCKSSocketPoolMap::iterator, bool> ret = - socks_socket_pools_.insert( - std::make_pair(socks_proxy, new SOCKSClientSocketPool( - g_max_sockets_per_proxy_server, g_max_sockets_per_group, - socks_pool_histograms_, host_resolver_, - new TCPClientSocketPool(g_max_sockets_per_proxy_server, - g_max_sockets_per_group, tcp_for_socks_pool_histograms_, - host_resolver_, socket_factory_, net_log_), - net_log_))); - - return ret.first->second; -} - -const scoped_refptr<SSLClientSocketPool>& -HttpNetworkSession::GetSocketPoolForSSLWithProxy( - const HostPortPair& proxy_server) { - SSLSocketPoolMap::const_iterator it = - ssl_socket_pools_for_proxies_.find(proxy_server); - if (it != ssl_socket_pools_for_proxies_.end()) - return it->second; - - SSLClientSocketPool* new_pool = new SSLClientSocketPool( - g_max_sockets_per_proxy_server, g_max_sockets_per_group, - ssl_pool_histograms_, host_resolver_, socket_factory_, - NULL, - GetSocketPoolForHTTPProxy(proxy_server), - GetSocketPoolForSOCKSProxy(proxy_server), - ssl_config_service_, net_log_); - - std::pair<SSLSocketPoolMap::iterator, bool> ret = - ssl_socket_pools_for_proxies_.insert(std::make_pair(proxy_server, - new_pool)); - - return ret.first->second; -} - -Value* HttpNetworkSession::SocketPoolInfoToValue() const { - ListValue* list = new ListValue(); - list->Append(tcp_socket_pool_->GetInfoAsValue("tcp_socket_pool", - "tcp_socket_pool", - false)); - // Third parameter is false because |ssl_socket_pool_| uses |tcp_socket_pool_| - // internally, and do not want to add it a second time. - list->Append(ssl_socket_pool_->GetInfoAsValue("ssl_socket_pool", - "ssl_socket_pool", - false)); - AddSocketPoolsToList(list, - http_proxy_socket_pools_, - "http_proxy_socket_pool", - true); - AddSocketPoolsToList(list, - socks_socket_pools_, - "socks_socket_pool", - true); - - // Third parameter is false because |ssl_socket_pools_for_proxies_| use - // socket pools in |http_proxy_socket_pools_| and |socks_socket_pools_|. - AddSocketPoolsToList(list, - ssl_socket_pools_for_proxies_, - "ssl_socket_pool_for_proxies", - false); - return list; -} - -// static -int HttpNetworkSession::max_sockets_per_group() { - return g_max_sockets_per_group; -} - -// static -void HttpNetworkSession::set_max_sockets_per_group(int socket_count) { - DCHECK_LT(0, socket_count); - // The following is a sanity check... but we should NEVER be near this value. - DCHECK_GT(100, socket_count); - g_max_sockets_per_group = socket_count; -} - -// static -void HttpNetworkSession::set_max_sockets_per_proxy_server(int socket_count) { - DCHECK_LT(0, socket_count); - DCHECK_GT(100, socket_count); // Sanity check. - // Assert this case early on. The max number of sockets per group cannot - // exceed the max number of sockets per proxy server. - DCHECK_LE(g_max_sockets_per_group, socket_count); - g_max_sockets_per_proxy_server = socket_count; -} - } // namespace net |