| 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 4f042bbf19cbd8c7d58cc439a9110ef1f27f9bb1..86ba2dd47212c94da9f2816ba22dbdbd7be52909 100644
|
| --- a/net/socket/client_socket_pool_base.cc
|
| +++ b/net/socket/client_socket_pool_base.cc
|
| @@ -250,6 +250,8 @@ void ClientSocketPoolBaseHelper::RequestSockets(
|
| group->NumActiveSocketSlots() < num_sockets &&
|
| num_iterations_left > 0 ; num_iterations_left--) {
|
| int rv = RequestSocketInternal(group_name, &request);
|
| + // TODO(willchan): Possibly check for ERR_PRECONNECT_MAX_SOCKET_LIMIT so we
|
| + // can log it into the NetLog.
|
| if (rv < 0 && rv != ERR_IO_PENDING) {
|
| // We're encountering a synchronous error. Give up.
|
| if (!ContainsKey(group_map_, group_name))
|
| @@ -298,7 +300,9 @@ int ClientSocketPoolBaseHelper::RequestSocketInternal(
|
|
|
| if (ReachedMaxSocketsLimit()) {
|
| if (idle_socket_count() > 0) {
|
| - CloseOneIdleSocket();
|
| + bool closed = CloseOneIdleSocketExceptInGroup(group);
|
| + if (preconnecting && !closed)
|
| + return ERR_PRECONNECT_MAX_SOCKET_LIMIT;
|
| } else {
|
| // We could check if we really have a stalled group here, but it requires
|
| // a scan of all groups, so just flip a flag here, and do the check later.
|
| @@ -940,10 +944,17 @@ bool ClientSocketPoolBaseHelper::ReachedMaxSocketsLimit() const {
|
| }
|
|
|
| void ClientSocketPoolBaseHelper::CloseOneIdleSocket() {
|
| + CloseOneIdleSocketExceptInGroup(NULL);
|
| +}
|
| +
|
| +bool ClientSocketPoolBaseHelper::CloseOneIdleSocketExceptInGroup(
|
| + const Group* exception_group) {
|
| CHECK_GT(idle_socket_count(), 0);
|
|
|
| for (GroupMap::iterator i = group_map_.begin(); i != group_map_.end(); ++i) {
|
| Group* group = i->second;
|
| + if (exception_group == group)
|
| + continue;
|
| std::list<IdleSocket>* idle_sockets = group->mutable_idle_sockets();
|
|
|
| if (!idle_sockets->empty()) {
|
| @@ -953,11 +964,14 @@ void ClientSocketPoolBaseHelper::CloseOneIdleSocket() {
|
| if (group->IsEmpty())
|
| RemoveGroup(i);
|
|
|
| - return;
|
| + return true;
|
| }
|
| }
|
|
|
| - LOG(DFATAL) << "No idle socket found to close!.";
|
| + if (!exception_group)
|
| + LOG(DFATAL) << "No idle socket found to close!.";
|
| +
|
| + return false;
|
| }
|
|
|
| void ClientSocketPoolBaseHelper::InvokeUserCallbackLater(
|
|
|