OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/socket/client_socket_pool_base.h" | 5 #include "net/socket/client_socket_pool_base.h" |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/format_macros.h" | 8 #include "base/format_macros.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/metrics/stats_counters.h" | 10 #include "base/metrics/stats_counters.h" |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 num_sockets = max_sockets_per_group_; | 236 num_sockets = max_sockets_per_group_; |
237 } | 237 } |
238 | 238 |
239 request.net_log().BeginEvent( | 239 request.net_log().BeginEvent( |
240 NetLog::TYPE_SOCKET_POOL_CONNECTING_N_SOCKETS, | 240 NetLog::TYPE_SOCKET_POOL_CONNECTING_N_SOCKETS, |
241 make_scoped_refptr(new NetLogIntegerParameter( | 241 make_scoped_refptr(new NetLogIntegerParameter( |
242 "num_sockets", num_sockets))); | 242 "num_sockets", num_sockets))); |
243 | 243 |
244 Group* group = GetOrCreateGroup(group_name); | 244 Group* group = GetOrCreateGroup(group_name); |
245 | 245 |
| 246 // RequestSocketsInternal() may delete the group. |
| 247 bool deleted_group = false; |
| 248 |
246 for (int num_iterations_left = num_sockets; | 249 for (int num_iterations_left = num_sockets; |
247 group->NumActiveSocketSlots() < num_sockets && | 250 group->NumActiveSocketSlots() < num_sockets && |
248 num_iterations_left > 0 ; num_iterations_left--) { | 251 num_iterations_left > 0 ; num_iterations_left--) { |
249 int rv = RequestSocketInternal(group_name, &request); | 252 int rv = RequestSocketInternal(group_name, &request); |
250 if (rv < 0 && rv != ERR_IO_PENDING) { | 253 if (rv < 0 && rv != ERR_IO_PENDING) { |
251 // We're encountering a synchronous error. Give up. | 254 // We're encountering a synchronous error. Give up. |
| 255 if (!ContainsKey(group_map_, group_name)) |
| 256 deleted_group = true; |
| 257 break; |
| 258 } |
| 259 if (!ContainsKey(group_map_, group_name)) { |
| 260 // Unexpected. The group should only be getting deleted on synchronous |
| 261 // error. |
| 262 NOTREACHED(); |
| 263 deleted_group = true; |
252 break; | 264 break; |
253 } | 265 } |
254 } | 266 } |
255 | 267 |
256 if (group->IsEmpty()) | 268 if (!deleted_group && group->IsEmpty()) |
257 RemoveGroup(group_name); | 269 RemoveGroup(group_name); |
258 | 270 |
259 request.net_log().EndEvent( | 271 request.net_log().EndEvent( |
260 NetLog::TYPE_SOCKET_POOL_CONNECTING_N_SOCKETS, NULL); | 272 NetLog::TYPE_SOCKET_POOL_CONNECTING_N_SOCKETS, NULL); |
261 } | 273 } |
262 | 274 |
263 int ClientSocketPoolBaseHelper::RequestSocketInternal( | 275 int ClientSocketPoolBaseHelper::RequestSocketInternal( |
264 const std::string& group_name, | 276 const std::string& group_name, |
265 const Request* request) { | 277 const Request* request) { |
266 DCHECK_GE(request->priority(), 0); | 278 DCHECK_GE(request->priority(), 0); |
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1047 // Delete active jobs. | 1059 // Delete active jobs. |
1048 STLDeleteElements(&jobs_); | 1060 STLDeleteElements(&jobs_); |
1049 | 1061 |
1050 // Cancel pending backup job. | 1062 // Cancel pending backup job. |
1051 method_factory_.RevokeAll(); | 1063 method_factory_.RevokeAll(); |
1052 } | 1064 } |
1053 | 1065 |
1054 } // namespace internal | 1066 } // namespace internal |
1055 | 1067 |
1056 } // namespace net | 1068 } // namespace net |
OLD | NEW |