summaryrefslogtreecommitdiffstats
path: root/net/socket/client_socket_pool_base.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket/client_socket_pool_base.cc')
-rw-r--r--net/socket/client_socket_pool_base.cc17
1 files changed, 15 insertions, 2 deletions
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc
index 0b26b75..7e5c24fc 100644
--- a/net/socket/client_socket_pool_base.cc
+++ b/net/socket/client_socket_pool_base.cc
@@ -257,6 +257,11 @@ int ClientSocketPoolBaseHelper::RequestSocketInternal(
group.jobs.insert(job);
} else {
LogBoundConnectJobToRequest(connect_job->net_log().source(), request);
+ ClientSocket* error_socket = connect_job->ReleaseSocket();
+ if (error_socket) {
+ HandOutSocket(error_socket, false /* not reused */, handle,
+ base::TimeDelta(), &group, request->net_log());
+ }
if (group.IsEmpty())
group_map_.erase(group_name);
}
@@ -605,16 +610,24 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete(
OnAvailableSocketSlot(group_name, MayHaveStalledGroups());
}
} else {
- DCHECK(!socket.get());
+ // If we got a socket, it must contain error information so pass that
+ // up so that the caller can retrieve it.
+ bool handed_out_socket = false;
if (!group.pending_requests.empty()) {
scoped_ptr<const Request> r(RemoveRequestFromQueue(
group.pending_requests.begin(), &group.pending_requests));
LogBoundConnectJobToRequest(job_log.source(), r.get());
+ if (socket.get()) {
+ handed_out_socket = true;
+ HandOutSocket(socket.release(), false /* unused socket */, r->handle(),
+ base::TimeDelta(), &group, r->net_log());
+ }
r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL,
new NetLogIntegerParameter("net_error", result));
r->callback()->Run(result);
}
- OnAvailableSocketSlot(group_name, MayHaveStalledGroups());
+ if (!handed_out_socket)
+ OnAvailableSocketSlot(group_name, MayHaveStalledGroups());
}
}