diff options
author | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-07 18:22:24 +0000 |
---|---|---|
committer | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-07 18:22:24 +0000 |
commit | a7e38577aab81d13d9fc1dff5a8b6fe164ed2102 (patch) | |
tree | 03c3e30bd44f33a4317bbe5606f9c0e40c27ce40 /net/socket/client_socket_pool_base.cc | |
parent | b846acde84543772099763542d9411eacbe684f9 (diff) | |
download | chromium_src-a7e38577aab81d13d9fc1dff5a8b6fe164ed2102.zip chromium_src-a7e38577aab81d13d9fc1dff5a8b6fe164ed2102.tar.gz chromium_src-a7e38577aab81d13d9fc1dff5a8b6fe164ed2102.tar.bz2 |
Do not attempt to reuse active sockets after a socket pool flush (usually a network change).
Implements this functionality by adding an |id_| field to ClientSocketPoolBaseHelper that is incremented on each Flush().
BUG=45872
Review URL: http://codereview.chromium.org/2647003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49076 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket/client_socket_pool_base.cc')
-rw-r--r-- | net/socket/client_socket_pool_base.cc | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc index f584996c..80857e5 100644 --- a/net/socket/client_socket_pool_base.cc +++ b/net/socket/client_socket_pool_base.cc @@ -142,7 +142,8 @@ ClientSocketPoolBaseHelper::ClientSocketPoolBaseHelper( connect_job_factory_(connect_job_factory), network_change_notifier_(network_change_notifier), backup_jobs_enabled_(false), - ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { + ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), + pool_generation_number_(0) { DCHECK_LE(0, max_sockets_per_group); DCHECK_LE(max_sockets_per_group, max_sockets); @@ -370,7 +371,8 @@ void ClientSocketPoolBaseHelper::CancelRequest( } void ClientSocketPoolBaseHelper::ReleaseSocket(const std::string& group_name, - ClientSocket* socket) { + ClientSocket* socket, + int id) { Group& group = group_map_[group_name]; group.num_releasing_sockets++; num_releasing_sockets_++; @@ -379,7 +381,7 @@ void ClientSocketPoolBaseHelper::ReleaseSocket(const std::string& group_name, // another to begin doing work. This also avoids nasty recursion issues. // NOTE: We cannot refer to the handle argument after this method returns. MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( - this, &ClientSocketPoolBaseHelper::DoReleaseSocket, group_name, socket)); + this, &ClientSocketPoolBaseHelper::DoReleaseSocket, group_name, socket, id)); } void ClientSocketPoolBaseHelper::CloseIdleSockets() { @@ -483,7 +485,8 @@ void ClientSocketPoolBaseHelper::DecrementIdleCount() { } void ClientSocketPoolBaseHelper::DoReleaseSocket(const std::string& group_name, - ClientSocket* socket) { + ClientSocket* socket, + int id) { // Running callbacks can cause the last outside reference to be released. // Hold onto a reference. scoped_refptr<ClientSocketPoolBaseHelper> ref_holder(this); @@ -505,7 +508,8 @@ void ClientSocketPoolBaseHelper::DoReleaseSocket(const std::string& group_name, CHECK_GT(num_releasing_sockets_, 0); num_releasing_sockets_--; - const bool can_reuse = socket->IsConnectedAndIdle(); + const bool can_reuse = socket->IsConnectedAndIdle() && + id == pool_generation_number_; if (can_reuse) { AddIdleSocket(socket, true /* used socket */, &group); } else { @@ -629,7 +633,8 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete( } } -void ClientSocketPoolBaseHelper::OnIPAddressChanged() { +void ClientSocketPoolBaseHelper::Flush() { + pool_generation_number_++; CancelAllConnectJobs(); CloseIdleSockets(); } @@ -712,6 +717,7 @@ void ClientSocketPoolBaseHelper::HandOutSocket( handle->set_socket(socket); handle->set_is_reused(reused); handle->set_idle_time(idle_time); + handle->set_pool_id(pool_generation_number_); if (reused) { net_log.AddEvent( |