Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(328)

Side by Side Diff: net/socket/client_socket_pool_base.cc

Issue 2315613002: Extracted NetLog class's inner enum types into their own enum classes and (Closed)
Patch Set: Ran "git cl format" on code. Much formatting ensued. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/socket/client_socket_handle.cc ('k') | net/socket/client_socket_pool_base_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
11 #include "base/format_macros.h" 11 #include "base/format_macros.h"
12 #include "base/location.h" 12 #include "base/location.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/metrics/histogram_macros.h" 14 #include "base/metrics/histogram_macros.h"
15 #include "base/single_thread_task_runner.h" 15 #include "base/single_thread_task_runner.h"
16 #include "base/stl_util.h" 16 #include "base/stl_util.h"
17 #include "base/strings/string_util.h" 17 #include "base/strings/string_util.h"
18 #include "base/threading/thread_task_runner_handle.h" 18 #include "base/threading/thread_task_runner_handle.h"
19 #include "base/time/time.h" 19 #include "base/time/time.h"
20 #include "base/trace_event/trace_event.h" 20 #include "base/trace_event/trace_event.h"
21 #include "base/values.h" 21 #include "base/values.h"
22 #include "net/base/net_errors.h" 22 #include "net/base/net_errors.h"
23 #include "net/log/net_log.h" 23 #include "net/log/net_log.h"
24 #include "net/log/net_log_event_type.h"
24 25
25 using base::TimeDelta; 26 using base::TimeDelta;
26 27
27 namespace net { 28 namespace net {
28 29
29 namespace { 30 namespace {
30 31
31 // Indicate whether or not we should establish a new transport layer connection 32 // Indicate whether or not we should establish a new transport layer connection
32 // after a certain timeout has passed without receiving an ACK. 33 // after a certain timeout has passed without receiving an ACK.
33 bool g_connect_backup_jobs_enabled = true; 34 bool g_connect_backup_jobs_enabled = true;
34 35
35 } // namespace 36 } // namespace
36 37
37 ConnectJob::ConnectJob(const std::string& group_name, 38 ConnectJob::ConnectJob(const std::string& group_name,
38 base::TimeDelta timeout_duration, 39 base::TimeDelta timeout_duration,
39 RequestPriority priority, 40 RequestPriority priority,
40 ClientSocketPool::RespectLimits respect_limits, 41 ClientSocketPool::RespectLimits respect_limits,
41 Delegate* delegate, 42 Delegate* delegate,
42 const BoundNetLog& net_log) 43 const BoundNetLog& net_log)
43 : group_name_(group_name), 44 : group_name_(group_name),
44 timeout_duration_(timeout_duration), 45 timeout_duration_(timeout_duration),
45 priority_(priority), 46 priority_(priority),
46 respect_limits_(respect_limits), 47 respect_limits_(respect_limits),
47 delegate_(delegate), 48 delegate_(delegate),
48 net_log_(net_log), 49 net_log_(net_log),
49 idle_(true) { 50 idle_(true) {
50 DCHECK(!group_name.empty()); 51 DCHECK(!group_name.empty());
51 DCHECK(delegate); 52 DCHECK(delegate);
52 net_log.BeginEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB, 53 net_log.BeginEvent(NetLogEventType::SOCKET_POOL_CONNECT_JOB,
53 NetLog::StringCallback("group_name", &group_name_)); 54 NetLog::StringCallback("group_name", &group_name_));
54 } 55 }
55 56
56 ConnectJob::~ConnectJob() { 57 ConnectJob::~ConnectJob() {
57 net_log().EndEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB); 58 net_log().EndEvent(NetLogEventType::SOCKET_POOL_CONNECT_JOB);
58 } 59 }
59 60
60 std::unique_ptr<StreamSocket> ConnectJob::PassSocket() { 61 std::unique_ptr<StreamSocket> ConnectJob::PassSocket() {
61 return std::move(socket_); 62 return std::move(socket_);
62 } 63 }
63 64
64 int ConnectJob::Connect() { 65 int ConnectJob::Connect() {
65 if (!timeout_duration_.is_zero()) 66 if (!timeout_duration_.is_zero())
66 timer_.Start(FROM_HERE, timeout_duration_, this, &ConnectJob::OnTimeout); 67 timer_.Start(FROM_HERE, timeout_duration_, this, &ConnectJob::OnTimeout);
67 68
68 idle_ = false; 69 idle_ = false;
69 70
70 LogConnectStart(); 71 LogConnectStart();
71 72
72 int rv = ConnectInternal(); 73 int rv = ConnectInternal();
73 74
74 if (rv != ERR_IO_PENDING) { 75 if (rv != ERR_IO_PENDING) {
75 LogConnectCompletion(rv); 76 LogConnectCompletion(rv);
76 delegate_ = NULL; 77 delegate_ = NULL;
77 } 78 }
78 79
79 return rv; 80 return rv;
80 } 81 }
81 82
82 void ConnectJob::SetSocket(std::unique_ptr<StreamSocket> socket) { 83 void ConnectJob::SetSocket(std::unique_ptr<StreamSocket> socket) {
83 if (socket) { 84 if (socket) {
84 net_log().AddEvent(NetLog::TYPE_CONNECT_JOB_SET_SOCKET, 85 net_log().AddEvent(NetLogEventType::CONNECT_JOB_SET_SOCKET,
85 socket->NetLog().source().ToEventParametersCallback()); 86 socket->NetLog().source().ToEventParametersCallback());
86 } 87 }
87 socket_ = std::move(socket); 88 socket_ = std::move(socket);
88 } 89 }
89 90
90 void ConnectJob::NotifyDelegateOfCompletion(int rv) { 91 void ConnectJob::NotifyDelegateOfCompletion(int rv) {
91 TRACE_EVENT0("net", "ConnectJob::NotifyDelegateOfCompletion"); 92 TRACE_EVENT0("net", "ConnectJob::NotifyDelegateOfCompletion");
92 // The delegate will own |this|. 93 // The delegate will own |this|.
93 Delegate* delegate = delegate_; 94 Delegate* delegate = delegate_;
94 delegate_ = NULL; 95 delegate_ = NULL;
95 96
96 LogConnectCompletion(rv); 97 LogConnectCompletion(rv);
97 delegate->OnConnectJobComplete(rv, this); 98 delegate->OnConnectJobComplete(rv, this);
98 } 99 }
99 100
100 void ConnectJob::ResetTimer(base::TimeDelta remaining_time) { 101 void ConnectJob::ResetTimer(base::TimeDelta remaining_time) {
101 timer_.Stop(); 102 timer_.Stop();
102 timer_.Start(FROM_HERE, remaining_time, this, &ConnectJob::OnTimeout); 103 timer_.Start(FROM_HERE, remaining_time, this, &ConnectJob::OnTimeout);
103 } 104 }
104 105
105 void ConnectJob::LogConnectStart() { 106 void ConnectJob::LogConnectStart() {
106 connect_timing_.connect_start = base::TimeTicks::Now(); 107 connect_timing_.connect_start = base::TimeTicks::Now();
107 net_log().BeginEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT); 108 net_log().BeginEvent(NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT);
108 } 109 }
109 110
110 void ConnectJob::LogConnectCompletion(int net_error) { 111 void ConnectJob::LogConnectCompletion(int net_error) {
111 connect_timing_.connect_end = base::TimeTicks::Now(); 112 connect_timing_.connect_end = base::TimeTicks::Now();
112 net_log().EndEventWithNetErrorCode( 113 net_log().EndEventWithNetErrorCode(
113 NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT, net_error); 114 NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT, net_error);
114 } 115 }
115 116
116 void ConnectJob::OnTimeout() { 117 void ConnectJob::OnTimeout() {
117 // Make sure the socket is NULL before calling into |delegate|. 118 // Make sure the socket is NULL before calling into |delegate|.
118 SetSocket(std::unique_ptr<StreamSocket>()); 119 SetSocket(std::unique_ptr<StreamSocket>());
119 120
120 net_log_.AddEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT); 121 net_log_.AddEvent(NetLogEventType::SOCKET_POOL_CONNECT_JOB_TIMED_OUT);
121 122
122 NotifyDelegateOfCompletion(ERR_TIMED_OUT); 123 NotifyDelegateOfCompletion(ERR_TIMED_OUT);
123 } 124 }
124 125
125 namespace internal { 126 namespace internal {
126 127
127 ClientSocketPoolBaseHelper::Request::Request( 128 ClientSocketPoolBaseHelper::Request::Request(
128 ClientSocketHandle* handle, 129 ClientSocketHandle* handle,
129 const CompletionCallback& callback, 130 const CompletionCallback& callback,
130 RequestPriority priority, 131 RequestPriority priority,
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 262
262 int ClientSocketPoolBaseHelper::RequestSocket( 263 int ClientSocketPoolBaseHelper::RequestSocket(
263 const std::string& group_name, 264 const std::string& group_name,
264 std::unique_ptr<const Request> request) { 265 std::unique_ptr<const Request> request) {
265 CHECK(!request->callback().is_null()); 266 CHECK(!request->callback().is_null());
266 CHECK(request->handle()); 267 CHECK(request->handle());
267 268
268 // Cleanup any timed-out idle sockets. 269 // Cleanup any timed-out idle sockets.
269 CleanupIdleSockets(false); 270 CleanupIdleSockets(false);
270 271
271 request->net_log().BeginEvent(NetLog::TYPE_SOCKET_POOL); 272 request->net_log().BeginEvent(NetLogEventType::SOCKET_POOL);
272 Group* group = GetOrCreateGroup(group_name); 273 Group* group = GetOrCreateGroup(group_name);
273 274
274 int rv = RequestSocketInternal(group_name, *request); 275 int rv = RequestSocketInternal(group_name, *request);
275 if (rv != ERR_IO_PENDING) { 276 if (rv != ERR_IO_PENDING) {
276 request->net_log().EndEventWithNetErrorCode(NetLog::TYPE_SOCKET_POOL, rv); 277 request->net_log().EndEventWithNetErrorCode(NetLogEventType::SOCKET_POOL,
278 rv);
277 CHECK(!request->handle()->is_initialized()); 279 CHECK(!request->handle()->is_initialized());
278 request.reset(); 280 request.reset();
279 } else { 281 } else {
280 group->InsertPendingRequest(std::move(request)); 282 group->InsertPendingRequest(std::move(request));
281 // Have to do this asynchronously, as closing sockets in higher level pools 283 // Have to do this asynchronously, as closing sockets in higher level pools
282 // call back in to |this|, which will cause all sorts of fun and exciting 284 // call back in to |this|, which will cause all sorts of fun and exciting
283 // re-entrancy issues if the socket pool is doing something else at the 285 // re-entrancy issues if the socket pool is doing something else at the
284 // time. 286 // time.
285 if (group->CanUseAdditionalSocketSlot(max_sockets_per_group_)) { 287 if (group->CanUseAdditionalSocketSlot(max_sockets_per_group_)) {
286 base::ThreadTaskRunnerHandle::Get()->PostTask( 288 base::ThreadTaskRunnerHandle::Get()->PostTask(
(...skipping 13 matching lines...) Expand all
300 DCHECK(request.callback().is_null()); 302 DCHECK(request.callback().is_null());
301 DCHECK(!request.handle()); 303 DCHECK(!request.handle());
302 304
303 // Cleanup any timed-out idle sockets. 305 // Cleanup any timed-out idle sockets.
304 CleanupIdleSockets(false); 306 CleanupIdleSockets(false);
305 307
306 if (num_sockets > max_sockets_per_group_) { 308 if (num_sockets > max_sockets_per_group_) {
307 num_sockets = max_sockets_per_group_; 309 num_sockets = max_sockets_per_group_;
308 } 310 }
309 311
310 request.net_log().BeginEvent(NetLog::TYPE_SOCKET_POOL_CONNECTING_N_SOCKETS, 312 request.net_log().BeginEvent(
311 NetLog::IntCallback("num_sockets", num_sockets)); 313 NetLogEventType::SOCKET_POOL_CONNECTING_N_SOCKETS,
314 NetLog::IntCallback("num_sockets", num_sockets));
312 315
313 Group* group = GetOrCreateGroup(group_name); 316 Group* group = GetOrCreateGroup(group_name);
314 317
315 // RequestSocketsInternal() may delete the group. 318 // RequestSocketsInternal() may delete the group.
316 bool deleted_group = false; 319 bool deleted_group = false;
317 320
318 int rv = OK; 321 int rv = OK;
319 for (int num_iterations_left = num_sockets; 322 for (int num_iterations_left = num_sockets;
320 group->NumActiveSocketSlots() < num_sockets && 323 group->NumActiveSocketSlots() < num_sockets &&
321 num_iterations_left > 0 ; num_iterations_left--) { 324 num_iterations_left > 0 ; num_iterations_left--) {
(...skipping 12 matching lines...) Expand all
334 break; 337 break;
335 } 338 }
336 } 339 }
337 340
338 if (!deleted_group && group->IsEmpty()) 341 if (!deleted_group && group->IsEmpty())
339 RemoveGroup(group_name); 342 RemoveGroup(group_name);
340 343
341 if (rv == ERR_IO_PENDING) 344 if (rv == ERR_IO_PENDING)
342 rv = OK; 345 rv = OK;
343 request.net_log().EndEventWithNetErrorCode( 346 request.net_log().EndEventWithNetErrorCode(
344 NetLog::TYPE_SOCKET_POOL_CONNECTING_N_SOCKETS, rv); 347 NetLogEventType::SOCKET_POOL_CONNECTING_N_SOCKETS, rv);
345 } 348 }
346 349
347 int ClientSocketPoolBaseHelper::RequestSocketInternal( 350 int ClientSocketPoolBaseHelper::RequestSocketInternal(
348 const std::string& group_name, 351 const std::string& group_name,
349 const Request& request) { 352 const Request& request) {
350 ClientSocketHandle* const handle = request.handle(); 353 ClientSocketHandle* const handle = request.handle();
351 const bool preconnecting = !handle; 354 const bool preconnecting = !handle;
352 Group* group = GetOrCreateGroup(group_name); 355 Group* group = GetOrCreateGroup(group_name);
353 356
354 if (!(request.flags() & NO_IDLE_SOCKETS)) { 357 if (!(request.flags() & NO_IDLE_SOCKETS)) {
355 // Try to reuse a socket. 358 // Try to reuse a socket.
356 if (AssignIdleSocketToRequest(request, group)) 359 if (AssignIdleSocketToRequest(request, group))
357 return OK; 360 return OK;
358 } 361 }
359 362
360 // If there are more ConnectJobs than pending requests, don't need to do 363 // If there are more ConnectJobs than pending requests, don't need to do
361 // anything. Can just wait for the extra job to connect, and then assign it 364 // anything. Can just wait for the extra job to connect, and then assign it
362 // to the request. 365 // to the request.
363 if (!preconnecting && group->TryToUseUnassignedConnectJob()) 366 if (!preconnecting && group->TryToUseUnassignedConnectJob())
364 return ERR_IO_PENDING; 367 return ERR_IO_PENDING;
365 368
366 // Can we make another active socket now? 369 // Can we make another active socket now?
367 if (!group->HasAvailableSocketSlot(max_sockets_per_group_) && 370 if (!group->HasAvailableSocketSlot(max_sockets_per_group_) &&
368 request.respect_limits() == ClientSocketPool::RespectLimits::ENABLED) { 371 request.respect_limits() == ClientSocketPool::RespectLimits::ENABLED) {
369 // TODO(willchan): Consider whether or not we need to close a socket in a 372 // TODO(willchan): Consider whether or not we need to close a socket in a
370 // higher layered group. I don't think this makes sense since we would just 373 // higher layered group. I don't think this makes sense since we would just
371 // reuse that socket then if we needed one and wouldn't make it down to this 374 // reuse that socket then if we needed one and wouldn't make it down to this
372 // layer. 375 // layer.
373 request.net_log().AddEvent( 376 request.net_log().AddEvent(
374 NetLog::TYPE_SOCKET_POOL_STALLED_MAX_SOCKETS_PER_GROUP); 377 NetLogEventType::SOCKET_POOL_STALLED_MAX_SOCKETS_PER_GROUP);
375 return ERR_IO_PENDING; 378 return ERR_IO_PENDING;
376 } 379 }
377 380
378 if (ReachedMaxSocketsLimit() && 381 if (ReachedMaxSocketsLimit() &&
379 request.respect_limits() == ClientSocketPool::RespectLimits::ENABLED) { 382 request.respect_limits() == ClientSocketPool::RespectLimits::ENABLED) {
380 // NOTE(mmenke): Wonder if we really need different code for each case 383 // NOTE(mmenke): Wonder if we really need different code for each case
381 // here. Only reason for them now seems to be preconnects. 384 // here. Only reason for them now seems to be preconnects.
382 if (idle_socket_count() > 0) { 385 if (idle_socket_count() > 0) {
383 // There's an idle socket in this pool. Either that's because there's 386 // There's an idle socket in this pool. Either that's because there's
384 // still one in this group, but we got here due to preconnecting bypassing 387 // still one in this group, but we got here due to preconnecting bypassing
385 // idle sockets, or because there's an idle socket in another group. 388 // idle sockets, or because there's an idle socket in another group.
386 bool closed = CloseOneIdleSocketExceptInGroup(group); 389 bool closed = CloseOneIdleSocketExceptInGroup(group);
387 if (preconnecting && !closed) 390 if (preconnecting && !closed)
388 return ERR_PRECONNECT_MAX_SOCKET_LIMIT; 391 return ERR_PRECONNECT_MAX_SOCKET_LIMIT;
389 } else { 392 } else {
390 // We could check if we really have a stalled group here, but it requires 393 // We could check if we really have a stalled group here, but it requires
391 // a scan of all groups, so just flip a flag here, and do the check later. 394 // a scan of all groups, so just flip a flag here, and do the check later.
392 request.net_log().AddEvent(NetLog::TYPE_SOCKET_POOL_STALLED_MAX_SOCKETS); 395 request.net_log().AddEvent(
396 NetLogEventType::SOCKET_POOL_STALLED_MAX_SOCKETS);
393 return ERR_IO_PENDING; 397 return ERR_IO_PENDING;
394 } 398 }
395 } 399 }
396 400
397 // We couldn't find a socket to reuse, and there's space to allocate one, 401 // We couldn't find a socket to reuse, and there's space to allocate one,
398 // so allocate and connect a new one. 402 // so allocate and connect a new one.
399 std::unique_ptr<ConnectJob> connect_job( 403 std::unique_ptr<ConnectJob> connect_job(
400 connect_job_factory_->NewConnectJob(group_name, request, this)); 404 connect_job_factory_->NewConnectJob(group_name, request, this));
401 405
402 int rv = connect_job->Connect(); 406 int rv = connect_job->Connect();
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 group, request.net_log()); 500 group, request.net_log());
497 return true; 501 return true;
498 } 502 }
499 503
500 return false; 504 return false;
501 } 505 }
502 506
503 // static 507 // static
504 void ClientSocketPoolBaseHelper::LogBoundConnectJobToRequest( 508 void ClientSocketPoolBaseHelper::LogBoundConnectJobToRequest(
505 const NetLog::Source& connect_job_source, const Request& request) { 509 const NetLog::Source& connect_job_source, const Request& request) {
506 request.net_log().AddEvent(NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 510 request.net_log().AddEvent(NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
507 connect_job_source.ToEventParametersCallback()); 511 connect_job_source.ToEventParametersCallback());
508 } 512 }
509 513
510 void ClientSocketPoolBaseHelper::CancelRequest( 514 void ClientSocketPoolBaseHelper::CancelRequest(
511 const std::string& group_name, ClientSocketHandle* handle) { 515 const std::string& group_name, ClientSocketHandle* handle) {
512 PendingCallbackMap::iterator callback_it = pending_callback_map_.find(handle); 516 PendingCallbackMap::iterator callback_it = pending_callback_map_.find(handle);
513 if (callback_it != pending_callback_map_.end()) { 517 if (callback_it != pending_callback_map_.end()) {
514 int result = callback_it->second.result; 518 int result = callback_it->second.result;
515 pending_callback_map_.erase(callback_it); 519 pending_callback_map_.erase(callback_it);
516 std::unique_ptr<StreamSocket> socket = handle->PassSocket(); 520 std::unique_ptr<StreamSocket> socket = handle->PassSocket();
517 if (socket) { 521 if (socket) {
518 if (result != OK) 522 if (result != OK)
519 socket->Disconnect(); 523 socket->Disconnect();
520 ReleaseSocket(handle->group_name(), std::move(socket), handle->id()); 524 ReleaseSocket(handle->group_name(), std::move(socket), handle->id());
521 } 525 }
522 return; 526 return;
523 } 527 }
524 528
525 CHECK(base::ContainsKey(group_map_, group_name)); 529 CHECK(base::ContainsKey(group_map_, group_name));
526 530
527 Group* group = GetOrCreateGroup(group_name); 531 Group* group = GetOrCreateGroup(group_name);
528 532
529 // Search pending_requests for matching handle. 533 // Search pending_requests for matching handle.
530 std::unique_ptr<const Request> request = 534 std::unique_ptr<const Request> request =
531 group->FindAndRemovePendingRequest(handle); 535 group->FindAndRemovePendingRequest(handle);
532 if (request) { 536 if (request) {
533 request->net_log().AddEvent(NetLog::TYPE_CANCELLED); 537 request->net_log().AddEvent(NetLogEventType::CANCELLED);
534 request->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL); 538 request->net_log().EndEvent(NetLogEventType::SOCKET_POOL);
535 539
536 // We let the job run, unless we're at the socket limit and there is 540 // We let the job run, unless we're at the socket limit and there is
537 // not another request waiting on the job. 541 // not another request waiting on the job.
538 if (group->jobs().size() > group->pending_request_count() && 542 if (group->jobs().size() > group->pending_request_count() &&
539 ReachedMaxSocketsLimit()) { 543 ReachedMaxSocketsLimit()) {
540 RemoveConnectJob(*group->jobs().begin(), group); 544 RemoveConnectJob(*group->jobs().begin(), group);
541 CheckForStalledSocketGroups(); 545 CheckForStalledSocketGroups();
542 } 546 }
543 } 547 }
544 } 548 }
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
864 868
865 if (result == OK) { 869 if (result == OK) {
866 DCHECK(socket.get()); 870 DCHECK(socket.get());
867 RemoveConnectJob(job, group); 871 RemoveConnectJob(job, group);
868 std::unique_ptr<const Request> request = group->PopNextPendingRequest(); 872 std::unique_ptr<const Request> request = group->PopNextPendingRequest();
869 if (request) { 873 if (request) {
870 LogBoundConnectJobToRequest(job_log.source(), *request); 874 LogBoundConnectJobToRequest(job_log.source(), *request);
871 HandOutSocket(std::move(socket), ClientSocketHandle::UNUSED, 875 HandOutSocket(std::move(socket), ClientSocketHandle::UNUSED,
872 connect_timing, request->handle(), base::TimeDelta(), group, 876 connect_timing, request->handle(), base::TimeDelta(), group,
873 request->net_log()); 877 request->net_log());
874 request->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL); 878 request->net_log().EndEvent(NetLogEventType::SOCKET_POOL);
875 InvokeUserCallbackLater(request->handle(), request->callback(), result); 879 InvokeUserCallbackLater(request->handle(), request->callback(), result);
876 } else { 880 } else {
877 AddIdleSocket(std::move(socket), group); 881 AddIdleSocket(std::move(socket), group);
878 OnAvailableSocketSlot(group_name, group); 882 OnAvailableSocketSlot(group_name, group);
879 CheckForStalledSocketGroups(); 883 CheckForStalledSocketGroups();
880 } 884 }
881 } else { 885 } else {
882 // If we got a socket, it must contain error information so pass that 886 // If we got a socket, it must contain error information so pass that
883 // up so that the caller can retrieve it. 887 // up so that the caller can retrieve it.
884 bool handed_out_socket = false; 888 bool handed_out_socket = false;
885 std::unique_ptr<const Request> request = group->PopNextPendingRequest(); 889 std::unique_ptr<const Request> request = group->PopNextPendingRequest();
886 if (request) { 890 if (request) {
887 LogBoundConnectJobToRequest(job_log.source(), *request); 891 LogBoundConnectJobToRequest(job_log.source(), *request);
888 job->GetAdditionalErrorState(request->handle()); 892 job->GetAdditionalErrorState(request->handle());
889 RemoveConnectJob(job, group); 893 RemoveConnectJob(job, group);
890 if (socket.get()) { 894 if (socket.get()) {
891 handed_out_socket = true; 895 handed_out_socket = true;
892 HandOutSocket(std::move(socket), ClientSocketHandle::UNUSED, 896 HandOutSocket(std::move(socket), ClientSocketHandle::UNUSED,
893 connect_timing, request->handle(), base::TimeDelta(), 897 connect_timing, request->handle(), base::TimeDelta(),
894 group, request->net_log()); 898 group, request->net_log());
895 } 899 }
896 request->net_log().EndEventWithNetErrorCode( 900 request->net_log().EndEventWithNetErrorCode(NetLogEventType::SOCKET_POOL,
897 NetLog::TYPE_SOCKET_POOL, result); 901 result);
898 InvokeUserCallbackLater(request->handle(), request->callback(), result); 902 InvokeUserCallbackLater(request->handle(), request->callback(), result);
899 } else { 903 } else {
900 RemoveConnectJob(job, group); 904 RemoveConnectJob(job, group);
901 } 905 }
902 if (!handed_out_socket) { 906 if (!handed_out_socket) {
903 OnAvailableSocketSlot(group_name, group); 907 OnAvailableSocketSlot(group_name, group);
904 CheckForStalledSocketGroups(); 908 CheckForStalledSocketGroups();
905 } 909 }
906 } 910 }
907 } 911 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
949 return; 953 return;
950 } 954 }
951 955
952 int rv = RequestSocketInternal(group_name, *next_request); 956 int rv = RequestSocketInternal(group_name, *next_request);
953 if (rv != ERR_IO_PENDING) { 957 if (rv != ERR_IO_PENDING) {
954 std::unique_ptr<const Request> request = group->PopNextPendingRequest(); 958 std::unique_ptr<const Request> request = group->PopNextPendingRequest();
955 DCHECK(request); 959 DCHECK(request);
956 if (group->IsEmpty()) 960 if (group->IsEmpty())
957 RemoveGroup(group_name); 961 RemoveGroup(group_name);
958 962
959 request->net_log().EndEventWithNetErrorCode(NetLog::TYPE_SOCKET_POOL, rv); 963 request->net_log().EndEventWithNetErrorCode(NetLogEventType::SOCKET_POOL,
964 rv);
960 InvokeUserCallbackLater(request->handle(), request->callback(), rv); 965 InvokeUserCallbackLater(request->handle(), request->callback(), rv);
961 } 966 }
962 } 967 }
963 968
964 void ClientSocketPoolBaseHelper::HandOutSocket( 969 void ClientSocketPoolBaseHelper::HandOutSocket(
965 std::unique_ptr<StreamSocket> socket, 970 std::unique_ptr<StreamSocket> socket,
966 ClientSocketHandle::SocketReuseType reuse_type, 971 ClientSocketHandle::SocketReuseType reuse_type,
967 const LoadTimingInfo::ConnectTiming& connect_timing, 972 const LoadTimingInfo::ConnectTiming& connect_timing,
968 ClientSocketHandle* handle, 973 ClientSocketHandle* handle,
969 base::TimeDelta idle_time, 974 base::TimeDelta idle_time,
970 Group* group, 975 Group* group,
971 const BoundNetLog& net_log) { 976 const BoundNetLog& net_log) {
972 DCHECK(socket); 977 DCHECK(socket);
973 handle->SetSocket(std::move(socket)); 978 handle->SetSocket(std::move(socket));
974 handle->set_reuse_type(reuse_type); 979 handle->set_reuse_type(reuse_type);
975 handle->set_idle_time(idle_time); 980 handle->set_idle_time(idle_time);
976 handle->set_pool_id(pool_generation_number_); 981 handle->set_pool_id(pool_generation_number_);
977 handle->set_connect_timing(connect_timing); 982 handle->set_connect_timing(connect_timing);
978 983
979 if (reuse_type == ClientSocketHandle::REUSED_IDLE) { 984 if (reuse_type == ClientSocketHandle::REUSED_IDLE) {
980 net_log.AddEvent( 985 net_log.AddEvent(
981 NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET, 986 NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET,
982 NetLog::IntCallback("idle_ms", 987 NetLog::IntCallback("idle_ms",
983 static_cast<int>(idle_time.InMilliseconds()))); 988 static_cast<int>(idle_time.InMilliseconds())));
984 989
985 UMA_HISTOGRAM_COUNTS_1000("Net.Socket.IdleSocketReuseTime", 990 UMA_HISTOGRAM_COUNTS_1000("Net.Socket.IdleSocketReuseTime",
986 idle_time.InSeconds()); 991 idle_time.InSeconds());
987 } 992 }
988 993
989 if (reuse_type != ClientSocketHandle::UNUSED) { 994 if (reuse_type != ClientSocketHandle::UNUSED) {
990 // The socket being handed out is no longer considered idle, but was 995 // The socket being handed out is no longer considered idle, but was
991 // considered idle until just before this method was called. 996 // considered idle until just before this method was called.
992 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.Socket.NumIdleSockets", 997 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.Socket.NumIdleSockets",
993 idle_socket_count() + 1, 1, 256, 50); 998 idle_socket_count() + 1, 1, 256, 50);
994 } 999 }
995 1000
996 net_log.AddEvent( 1001 net_log.AddEvent(
997 NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, 1002 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
998 handle->socket()->NetLog().source().ToEventParametersCallback()); 1003 handle->socket()->NetLog().source().ToEventParametersCallback());
999 1004
1000 handed_out_socket_count_++; 1005 handed_out_socket_count_++;
1001 group->IncrementActiveSocketCount(); 1006 group->IncrementActiveSocketCount();
1002 } 1007 }
1003 1008
1004 void ClientSocketPoolBaseHelper::AddIdleSocket( 1009 void ClientSocketPoolBaseHelper::AddIdleSocket(
1005 std::unique_ptr<StreamSocket> socket, 1010 std::unique_ptr<StreamSocket> socket,
1006 Group* group) { 1011 Group* group) {
1007 DCHECK(socket); 1012 DCHECK(socket);
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1222 StartBackupJobTimer(group_name, pool); 1227 StartBackupJobTimer(group_name, pool);
1223 return; 1228 return;
1224 } 1229 }
1225 1230
1226 if (pending_requests_.empty()) 1231 if (pending_requests_.empty())
1227 return; 1232 return;
1228 1233
1229 std::unique_ptr<ConnectJob> backup_job = 1234 std::unique_ptr<ConnectJob> backup_job =
1230 pool->connect_job_factory_->NewConnectJob( 1235 pool->connect_job_factory_->NewConnectJob(
1231 group_name, *pending_requests_.FirstMax().value(), pool); 1236 group_name, *pending_requests_.FirstMax().value(), pool);
1232 backup_job->net_log().AddEvent(NetLog::TYPE_BACKUP_CONNECT_JOB_CREATED); 1237 backup_job->net_log().AddEvent(NetLogEventType::BACKUP_CONNECT_JOB_CREATED);
1233 int rv = backup_job->Connect(); 1238 int rv = backup_job->Connect();
1234 pool->connecting_socket_count_++; 1239 pool->connecting_socket_count_++;
1235 ConnectJob* raw_backup_job = backup_job.get(); 1240 ConnectJob* raw_backup_job = backup_job.get();
1236 AddJob(std::move(backup_job), false); 1241 AddJob(std::move(backup_job), false);
1237 if (rv != ERR_IO_PENDING) 1242 if (rv != ERR_IO_PENDING)
1238 pool->OnConnectJobComplete(rv, raw_backup_job); 1243 pool->OnConnectJobComplete(rv, raw_backup_job);
1239 } 1244 }
1240 1245
1241 void ClientSocketPoolBaseHelper::Group::SanityCheck() { 1246 void ClientSocketPoolBaseHelper::Group::SanityCheck() {
1242 DCHECK_LE(unassigned_job_count_, jobs_.size()); 1247 DCHECK_LE(unassigned_job_count_, jobs_.size());
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 // If there are no more requests, kill the backup timer. 1325 // If there are no more requests, kill the backup timer.
1321 if (pending_requests_.empty()) 1326 if (pending_requests_.empty())
1322 backup_job_timer_.Stop(); 1327 backup_job_timer_.Stop();
1323 request->CrashIfInvalid(); 1328 request->CrashIfInvalid();
1324 return request; 1329 return request;
1325 } 1330 }
1326 1331
1327 } // namespace internal 1332 } // namespace internal
1328 1333
1329 } // namespace net 1334 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/client_socket_handle.cc ('k') | net/socket/client_socket_pool_base_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698