OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <math.h> | 7 #include <math.h> |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 base::TimeDelta timeout_duration, | 70 base::TimeDelta timeout_duration, |
71 Delegate* delegate, | 71 Delegate* delegate, |
72 const BoundNetLog& net_log) | 72 const BoundNetLog& net_log) |
73 : group_name_(group_name), | 73 : group_name_(group_name), |
74 timeout_duration_(timeout_duration), | 74 timeout_duration_(timeout_duration), |
75 delegate_(delegate), | 75 delegate_(delegate), |
76 net_log_(net_log), | 76 net_log_(net_log), |
77 idle_(true) { | 77 idle_(true) { |
78 DCHECK(!group_name.empty()); | 78 DCHECK(!group_name.empty()); |
79 DCHECK(delegate); | 79 DCHECK(delegate); |
80 net_log.BeginEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB, NULL); | 80 net_log.BeginEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB); |
81 } | 81 } |
82 | 82 |
83 ConnectJob::~ConnectJob() { | 83 ConnectJob::~ConnectJob() { |
84 net_log().EndEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB, NULL); | 84 net_log().EndEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB); |
85 } | 85 } |
86 | 86 |
87 int ConnectJob::Connect() { | 87 int ConnectJob::Connect() { |
88 if (timeout_duration_ != base::TimeDelta()) | 88 if (timeout_duration_ != base::TimeDelta()) |
89 timer_.Start(FROM_HERE, timeout_duration_, this, &ConnectJob::OnTimeout); | 89 timer_.Start(FROM_HERE, timeout_duration_, this, &ConnectJob::OnTimeout); |
90 | 90 |
91 idle_ = false; | 91 idle_ = false; |
92 | 92 |
93 LogConnectStart(); | 93 LogConnectStart(); |
94 | 94 |
95 int rv = ConnectInternal(); | 95 int rv = ConnectInternal(); |
96 | 96 |
97 if (rv != ERR_IO_PENDING) { | 97 if (rv != ERR_IO_PENDING) { |
98 LogConnectCompletion(rv); | 98 LogConnectCompletion(rv); |
99 delegate_ = NULL; | 99 delegate_ = NULL; |
100 } | 100 } |
101 | 101 |
102 return rv; | 102 return rv; |
103 } | 103 } |
104 | 104 |
105 void ConnectJob::set_socket(StreamSocket* socket) { | 105 void ConnectJob::set_socket(StreamSocket* socket) { |
106 if (socket) { | 106 if (socket) { |
107 net_log().AddEvent(NetLog::TYPE_CONNECT_JOB_SET_SOCKET, make_scoped_refptr( | 107 net_log().AddEvent(NetLog::TYPE_CONNECT_JOB_SET_SOCKET, |
108 new NetLogSourceParameter("source_dependency", | 108 socket->NetLog().source().ToEventParametersCallback()); |
109 socket->NetLog().source()))); | |
110 } | 109 } |
111 socket_.reset(socket); | 110 socket_.reset(socket); |
112 } | 111 } |
113 | 112 |
114 void ConnectJob::NotifyDelegateOfCompletion(int rv) { | 113 void ConnectJob::NotifyDelegateOfCompletion(int rv) { |
115 // The delegate will delete |this|. | 114 // The delegate will delete |this|. |
116 Delegate *delegate = delegate_; | 115 Delegate *delegate = delegate_; |
117 delegate_ = NULL; | 116 delegate_ = NULL; |
118 | 117 |
119 LogConnectCompletion(rv); | 118 LogConnectCompletion(rv); |
120 delegate->OnConnectJobComplete(rv, this); | 119 delegate->OnConnectJobComplete(rv, this); |
121 } | 120 } |
122 | 121 |
123 void ConnectJob::ResetTimer(base::TimeDelta remaining_time) { | 122 void ConnectJob::ResetTimer(base::TimeDelta remaining_time) { |
124 timer_.Stop(); | 123 timer_.Stop(); |
125 timer_.Start(FROM_HERE, remaining_time, this, &ConnectJob::OnTimeout); | 124 timer_.Start(FROM_HERE, remaining_time, this, &ConnectJob::OnTimeout); |
126 } | 125 } |
127 | 126 |
128 void ConnectJob::LogConnectStart() { | 127 void ConnectJob::LogConnectStart() { |
129 net_log().BeginEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT, | 128 net_log().BeginEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT, |
130 make_scoped_refptr(new NetLogStringParameter("group_name", group_name_))); | 129 NetLog::StringCallback("group_name", &group_name_)); |
131 } | 130 } |
132 | 131 |
133 void ConnectJob::LogConnectCompletion(int net_error) { | 132 void ConnectJob::LogConnectCompletion(int net_error) { |
134 net_log().EndEventWithNetErrorCode( | 133 net_log().EndEventWithNetErrorCode( |
135 NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT, net_error); | 134 NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT, net_error); |
136 } | 135 } |
137 | 136 |
138 void ConnectJob::OnTimeout() { | 137 void ConnectJob::OnTimeout() { |
139 // Make sure the socket is NULL before calling into |delegate|. | 138 // Make sure the socket is NULL before calling into |delegate|. |
140 set_socket(NULL); | 139 set_socket(NULL); |
141 | 140 |
142 net_log_.AddEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT, NULL); | 141 net_log_.AddEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT); |
143 | 142 |
144 NotifyDelegateOfCompletion(ERR_TIMED_OUT); | 143 NotifyDelegateOfCompletion(ERR_TIMED_OUT); |
145 } | 144 } |
146 | 145 |
147 namespace internal { | 146 namespace internal { |
148 | 147 |
149 ClientSocketPoolBaseHelper::Request::Request( | 148 ClientSocketPoolBaseHelper::Request::Request( |
150 ClientSocketHandle* handle, | 149 ClientSocketHandle* handle, |
151 const CompletionCallback& callback, | 150 const CompletionCallback& callback, |
152 RequestPriority priority, | 151 RequestPriority priority, |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 int ClientSocketPoolBaseHelper::RequestSocket( | 240 int ClientSocketPoolBaseHelper::RequestSocket( |
242 const std::string& group_name, | 241 const std::string& group_name, |
243 const Request* request) { | 242 const Request* request) { |
244 CHECK(!request->callback().is_null()); | 243 CHECK(!request->callback().is_null()); |
245 CHECK(request->handle()); | 244 CHECK(request->handle()); |
246 | 245 |
247 // Cleanup any timed-out idle sockets if no timer is used. | 246 // Cleanup any timed-out idle sockets if no timer is used. |
248 if (!use_cleanup_timer_) | 247 if (!use_cleanup_timer_) |
249 CleanupIdleSockets(false); | 248 CleanupIdleSockets(false); |
250 | 249 |
251 request->net_log().BeginEvent(NetLog::TYPE_SOCKET_POOL, NULL); | 250 request->net_log().BeginEvent(NetLog::TYPE_SOCKET_POOL); |
252 Group* group = GetOrCreateGroup(group_name); | 251 Group* group = GetOrCreateGroup(group_name); |
253 | 252 |
254 int rv = RequestSocketInternal(group_name, request); | 253 int rv = RequestSocketInternal(group_name, request); |
255 if (rv != ERR_IO_PENDING) { | 254 if (rv != ERR_IO_PENDING) { |
256 request->net_log().EndEventWithNetErrorCode(NetLog::TYPE_SOCKET_POOL, rv); | 255 request->net_log().EndEventWithNetErrorCode(NetLog::TYPE_SOCKET_POOL, rv); |
257 CHECK(!request->handle()->is_initialized()); | 256 CHECK(!request->handle()->is_initialized()); |
258 delete request; | 257 delete request; |
259 } else { | 258 } else { |
260 InsertRequestIntoQueue(request, group->mutable_pending_requests()); | 259 InsertRequestIntoQueue(request, group->mutable_pending_requests()); |
261 } | 260 } |
(...skipping 10 matching lines...) Expand all Loading... |
272 // Cleanup any timed out idle sockets if no timer is used. | 271 // Cleanup any timed out idle sockets if no timer is used. |
273 if (!use_cleanup_timer_) | 272 if (!use_cleanup_timer_) |
274 CleanupIdleSockets(false); | 273 CleanupIdleSockets(false); |
275 | 274 |
276 if (num_sockets > max_sockets_per_group_) { | 275 if (num_sockets > max_sockets_per_group_) { |
277 num_sockets = max_sockets_per_group_; | 276 num_sockets = max_sockets_per_group_; |
278 } | 277 } |
279 | 278 |
280 request.net_log().BeginEvent( | 279 request.net_log().BeginEvent( |
281 NetLog::TYPE_SOCKET_POOL_CONNECTING_N_SOCKETS, | 280 NetLog::TYPE_SOCKET_POOL_CONNECTING_N_SOCKETS, |
282 make_scoped_refptr(new NetLogIntegerParameter( | 281 NetLog::IntegerCallback("num_sockets", num_sockets)); |
283 "num_sockets", num_sockets))); | |
284 | 282 |
285 Group* group = GetOrCreateGroup(group_name); | 283 Group* group = GetOrCreateGroup(group_name); |
286 | 284 |
287 // RequestSocketsInternal() may delete the group. | 285 // RequestSocketsInternal() may delete the group. |
288 bool deleted_group = false; | 286 bool deleted_group = false; |
289 | 287 |
290 int rv = OK; | 288 int rv = OK; |
291 for (int num_iterations_left = num_sockets; | 289 for (int num_iterations_left = num_sockets; |
292 group->NumActiveSocketSlots() < num_sockets && | 290 group->NumActiveSocketSlots() < num_sockets && |
293 num_iterations_left > 0 ; num_iterations_left--) { | 291 num_iterations_left > 0 ; num_iterations_left--) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 return ERR_IO_PENDING; | 334 return ERR_IO_PENDING; |
337 | 335 |
338 // Can we make another active socket now? | 336 // Can we make another active socket now? |
339 if (!group->HasAvailableSocketSlot(max_sockets_per_group_) && | 337 if (!group->HasAvailableSocketSlot(max_sockets_per_group_) && |
340 !request->ignore_limits()) { | 338 !request->ignore_limits()) { |
341 // TODO(willchan): Consider whether or not we need to close a socket in a | 339 // TODO(willchan): Consider whether or not we need to close a socket in a |
342 // higher layered group. I don't think this makes sense since we would just | 340 // higher layered group. I don't think this makes sense since we would just |
343 // reuse that socket then if we needed one and wouldn't make it down to this | 341 // reuse that socket then if we needed one and wouldn't make it down to this |
344 // layer. | 342 // layer. |
345 request->net_log().AddEvent( | 343 request->net_log().AddEvent( |
346 NetLog::TYPE_SOCKET_POOL_STALLED_MAX_SOCKETS_PER_GROUP, NULL); | 344 NetLog::TYPE_SOCKET_POOL_STALLED_MAX_SOCKETS_PER_GROUP); |
347 return ERR_IO_PENDING; | 345 return ERR_IO_PENDING; |
348 } | 346 } |
349 | 347 |
350 if (ReachedMaxSocketsLimit() && !request->ignore_limits()) { | 348 if (ReachedMaxSocketsLimit() && !request->ignore_limits()) { |
351 // NOTE(mmenke): Wonder if we really need different code for each case | 349 // NOTE(mmenke): Wonder if we really need different code for each case |
352 // here. Only reason for them now seems to be preconnects. | 350 // here. Only reason for them now seems to be preconnects. |
353 if (idle_socket_count() > 0) { | 351 if (idle_socket_count() > 0) { |
354 // There's an idle socket in this pool. Either that's because there's | 352 // There's an idle socket in this pool. Either that's because there's |
355 // still one in this group, but we got here due to preconnecting bypassing | 353 // still one in this group, but we got here due to preconnecting bypassing |
356 // idle sockets, or because there's an idle socket in another group. | 354 // idle sockets, or because there's an idle socket in another group. |
357 bool closed = CloseOneIdleSocketExceptInGroup(group); | 355 bool closed = CloseOneIdleSocketExceptInGroup(group); |
358 if (preconnecting && !closed) | 356 if (preconnecting && !closed) |
359 return ERR_PRECONNECT_MAX_SOCKET_LIMIT; | 357 return ERR_PRECONNECT_MAX_SOCKET_LIMIT; |
360 } else { | 358 } else { |
361 // We could check if we really have a stalled group here, but it requires | 359 // We could check if we really have a stalled group here, but it requires |
362 // a scan of all groups, so just flip a flag here, and do the check later. | 360 // a scan of all groups, so just flip a flag here, and do the check later. |
363 request->net_log().AddEvent( | 361 request->net_log().AddEvent(NetLog::TYPE_SOCKET_POOL_STALLED_MAX_SOCKETS); |
364 NetLog::TYPE_SOCKET_POOL_STALLED_MAX_SOCKETS, NULL); | |
365 return ERR_IO_PENDING; | 362 return ERR_IO_PENDING; |
366 } | 363 } |
367 } | 364 } |
368 | 365 |
369 // We couldn't find a socket to reuse, and there's space to allocate one, | 366 // We couldn't find a socket to reuse, and there's space to allocate one, |
370 // so allocate and connect a new one. | 367 // so allocate and connect a new one. |
371 scoped_ptr<ConnectJob> connect_job( | 368 scoped_ptr<ConnectJob> connect_job( |
372 connect_job_factory_->NewConnectJob(group_name, *request, this)); | 369 connect_job_factory_->NewConnectJob(group_name, *request, this)); |
373 | 370 |
374 int rv = connect_job->Connect(); | 371 int rv = connect_job->Connect(); |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 request->net_log()); | 471 request->net_log()); |
475 return true; | 472 return true; |
476 } | 473 } |
477 | 474 |
478 return false; | 475 return false; |
479 } | 476 } |
480 | 477 |
481 // static | 478 // static |
482 void ClientSocketPoolBaseHelper::LogBoundConnectJobToRequest( | 479 void ClientSocketPoolBaseHelper::LogBoundConnectJobToRequest( |
483 const NetLog::Source& connect_job_source, const Request* request) { | 480 const NetLog::Source& connect_job_source, const Request* request) { |
484 request->net_log().AddEvent( | 481 request->net_log().AddEvent(NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
485 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 482 connect_job_source.ToEventParametersCallback()); |
486 make_scoped_refptr(new NetLogSourceParameter( | |
487 "source_dependency", connect_job_source))); | |
488 } | 483 } |
489 | 484 |
490 void ClientSocketPoolBaseHelper::CancelRequest( | 485 void ClientSocketPoolBaseHelper::CancelRequest( |
491 const std::string& group_name, ClientSocketHandle* handle) { | 486 const std::string& group_name, ClientSocketHandle* handle) { |
492 PendingCallbackMap::iterator callback_it = pending_callback_map_.find(handle); | 487 PendingCallbackMap::iterator callback_it = pending_callback_map_.find(handle); |
493 if (callback_it != pending_callback_map_.end()) { | 488 if (callback_it != pending_callback_map_.end()) { |
494 int result = callback_it->second.result; | 489 int result = callback_it->second.result; |
495 pending_callback_map_.erase(callback_it); | 490 pending_callback_map_.erase(callback_it); |
496 StreamSocket* socket = handle->release_socket(); | 491 StreamSocket* socket = handle->release_socket(); |
497 if (socket) { | 492 if (socket) { |
498 if (result != OK) | 493 if (result != OK) |
499 socket->Disconnect(); | 494 socket->Disconnect(); |
500 ReleaseSocket(handle->group_name(), socket, handle->id()); | 495 ReleaseSocket(handle->group_name(), socket, handle->id()); |
501 } | 496 } |
502 return; | 497 return; |
503 } | 498 } |
504 | 499 |
505 CHECK(ContainsKey(group_map_, group_name)); | 500 CHECK(ContainsKey(group_map_, group_name)); |
506 | 501 |
507 Group* group = GetOrCreateGroup(group_name); | 502 Group* group = GetOrCreateGroup(group_name); |
508 | 503 |
509 // Search pending_requests for matching handle. | 504 // Search pending_requests for matching handle. |
510 RequestQueue::iterator it = group->mutable_pending_requests()->begin(); | 505 RequestQueue::iterator it = group->mutable_pending_requests()->begin(); |
511 for (; it != group->pending_requests().end(); ++it) { | 506 for (; it != group->pending_requests().end(); ++it) { |
512 if ((*it)->handle() == handle) { | 507 if ((*it)->handle() == handle) { |
513 scoped_ptr<const Request> req(RemoveRequestFromQueue(it, group)); | 508 scoped_ptr<const Request> req(RemoveRequestFromQueue(it, group)); |
514 req->net_log().AddEvent(NetLog::TYPE_CANCELLED, NULL); | 509 req->net_log().AddEvent(NetLog::TYPE_CANCELLED); |
515 req->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL, NULL); | 510 req->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL); |
516 | 511 |
517 // We let the job run, unless we're at the socket limit. | 512 // We let the job run, unless we're at the socket limit. |
518 if (group->jobs().size() && ReachedMaxSocketsLimit()) { | 513 if (group->jobs().size() && ReachedMaxSocketsLimit()) { |
519 RemoveConnectJob(*group->jobs().begin(), group); | 514 RemoveConnectJob(*group->jobs().begin(), group); |
520 CheckForStalledSocketGroups(); | 515 CheckForStalledSocketGroups(); |
521 } | 516 } |
522 break; | 517 break; |
523 } | 518 } |
524 } | 519 } |
525 } | 520 } |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
855 if (result == OK) { | 850 if (result == OK) { |
856 DCHECK(socket.get()); | 851 DCHECK(socket.get()); |
857 RemoveConnectJob(job, group); | 852 RemoveConnectJob(job, group); |
858 if (!group->pending_requests().empty()) { | 853 if (!group->pending_requests().empty()) { |
859 scoped_ptr<const Request> r(RemoveRequestFromQueue( | 854 scoped_ptr<const Request> r(RemoveRequestFromQueue( |
860 group->mutable_pending_requests()->begin(), group)); | 855 group->mutable_pending_requests()->begin(), group)); |
861 LogBoundConnectJobToRequest(job_log.source(), r.get()); | 856 LogBoundConnectJobToRequest(job_log.source(), r.get()); |
862 HandOutSocket( | 857 HandOutSocket( |
863 socket.release(), false /* unused socket */, r->handle(), | 858 socket.release(), false /* unused socket */, r->handle(), |
864 base::TimeDelta(), group, r->net_log()); | 859 base::TimeDelta(), group, r->net_log()); |
865 r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL, NULL); | 860 r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL); |
866 InvokeUserCallbackLater(r->handle(), r->callback(), result); | 861 InvokeUserCallbackLater(r->handle(), r->callback(), result); |
867 } else { | 862 } else { |
868 AddIdleSocket(socket.release(), group); | 863 AddIdleSocket(socket.release(), group); |
869 OnAvailableSocketSlot(group_name, group); | 864 OnAvailableSocketSlot(group_name, group); |
870 CheckForStalledSocketGroups(); | 865 CheckForStalledSocketGroups(); |
871 } | 866 } |
872 } else { | 867 } else { |
873 // If we got a socket, it must contain error information so pass that | 868 // If we got a socket, it must contain error information so pass that |
874 // up so that the caller can retrieve it. | 869 // up so that the caller can retrieve it. |
875 bool handed_out_socket = false; | 870 bool handed_out_socket = false; |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
978 const BoundNetLog& net_log) { | 973 const BoundNetLog& net_log) { |
979 DCHECK(socket); | 974 DCHECK(socket); |
980 handle->set_socket(socket); | 975 handle->set_socket(socket); |
981 handle->set_is_reused(reused); | 976 handle->set_is_reused(reused); |
982 handle->set_idle_time(idle_time); | 977 handle->set_idle_time(idle_time); |
983 handle->set_pool_id(pool_generation_number_); | 978 handle->set_pool_id(pool_generation_number_); |
984 | 979 |
985 if (reused) { | 980 if (reused) { |
986 net_log.AddEvent( | 981 net_log.AddEvent( |
987 NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET, | 982 NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET, |
988 make_scoped_refptr(new NetLogIntegerParameter( | 983 NetLog::IntegerCallback( |
989 "idle_ms", static_cast<int>(idle_time.InMilliseconds())))); | 984 "idle_ms", static_cast<int>(idle_time.InMilliseconds()))); |
990 } | 985 } |
991 | 986 |
992 net_log.AddEvent(NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, | 987 net_log.AddEvent(NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, |
993 make_scoped_refptr(new NetLogSourceParameter( | 988 socket->NetLog().source().ToEventParametersCallback()); |
994 "source_dependency", socket->NetLog().source()))); | |
995 | 989 |
996 handed_out_socket_count_++; | 990 handed_out_socket_count_++; |
997 group->IncrementActiveSocketCount(); | 991 group->IncrementActiveSocketCount(); |
998 } | 992 } |
999 | 993 |
1000 void ClientSocketPoolBaseHelper::AddIdleSocket( | 994 void ClientSocketPoolBaseHelper::AddIdleSocket( |
1001 StreamSocket* socket, Group* group) { | 995 StreamSocket* socket, Group* group) { |
1002 DCHECK(socket); | 996 DCHECK(socket); |
1003 IdleSocket idle_socket; | 997 IdleSocket idle_socket; |
1004 idle_socket.socket = socket; | 998 idle_socket.socket = socket; |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1198 (*jobs_.begin())->GetLoadState() == LOAD_STATE_RESOLVING_HOST) { | 1192 (*jobs_.begin())->GetLoadState() == LOAD_STATE_RESOLVING_HOST) { |
1199 StartBackupSocketTimer(group_name, pool); | 1193 StartBackupSocketTimer(group_name, pool); |
1200 return; | 1194 return; |
1201 } | 1195 } |
1202 | 1196 |
1203 if (pending_requests_.empty()) | 1197 if (pending_requests_.empty()) |
1204 return; | 1198 return; |
1205 | 1199 |
1206 ConnectJob* backup_job = pool->connect_job_factory_->NewConnectJob( | 1200 ConnectJob* backup_job = pool->connect_job_factory_->NewConnectJob( |
1207 group_name, **pending_requests_.begin(), pool); | 1201 group_name, **pending_requests_.begin(), pool); |
1208 backup_job->net_log().AddEvent(NetLog::TYPE_SOCKET_BACKUP_CREATED, NULL); | 1202 backup_job->net_log().AddEvent(NetLog::TYPE_SOCKET_BACKUP_CREATED); |
1209 SIMPLE_STATS_COUNTER("socket.backup_created"); | 1203 SIMPLE_STATS_COUNTER("socket.backup_created"); |
1210 int rv = backup_job->Connect(); | 1204 int rv = backup_job->Connect(); |
1211 pool->connecting_socket_count_++; | 1205 pool->connecting_socket_count_++; |
1212 AddJob(backup_job, false); | 1206 AddJob(backup_job, false); |
1213 if (rv != ERR_IO_PENDING) | 1207 if (rv != ERR_IO_PENDING) |
1214 pool->OnConnectJobComplete(rv, backup_job); | 1208 pool->OnConnectJobComplete(rv, backup_job); |
1215 } | 1209 } |
1216 | 1210 |
1217 void ClientSocketPoolBaseHelper::Group::SanityCheck() { | 1211 void ClientSocketPoolBaseHelper::Group::SanityCheck() { |
1218 DCHECK_LE(unassigned_job_count_, jobs_.size()); | 1212 DCHECK_LE(unassigned_job_count_, jobs_.size()); |
1219 } | 1213 } |
1220 | 1214 |
1221 void ClientSocketPoolBaseHelper::Group::RemoveAllJobs() { | 1215 void ClientSocketPoolBaseHelper::Group::RemoveAllJobs() { |
1222 SanityCheck(); | 1216 SanityCheck(); |
1223 | 1217 |
1224 // Delete active jobs. | 1218 // Delete active jobs. |
1225 STLDeleteElements(&jobs_); | 1219 STLDeleteElements(&jobs_); |
1226 unassigned_job_count_ = 0; | 1220 unassigned_job_count_ = 0; |
1227 | 1221 |
1228 // Cancel pending backup job. | 1222 // Cancel pending backup job. |
1229 weak_factory_.InvalidateWeakPtrs(); | 1223 weak_factory_.InvalidateWeakPtrs(); |
1230 } | 1224 } |
1231 | 1225 |
1232 } // namespace internal | 1226 } // namespace internal |
1233 | 1227 |
1234 } // namespace net | 1228 } // namespace net |
OLD | NEW |