| Index: net/socket/client_socket_pool_base.cc
|
| diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc
|
| index f584996c9647dbe383876428eca9961892c50245..80857e55d396056512d0112734a2680ed492c1f1 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(
|
|
|