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

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

Issue 1376473003: Notify NQE of TCP RTT values (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Reorder initialization in constructor Created 4 years, 8 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
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/transport_client_socket_pool.h" 5 #include "net/socket/transport_client_socket_pool.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/lazy_instance.h" 11 #include "base/lazy_instance.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/message_loop/message_loop.h" 13 #include "base/message_loop/message_loop.h"
14 #include "base/metrics/histogram_macros.h" 14 #include "base/metrics/histogram_macros.h"
15 #include "base/profiler/scoped_tracker.h" 15 #include "base/profiler/scoped_tracker.h"
16 #include "base/strings/string_util.h" 16 #include "base/strings/string_util.h"
17 #include "base/synchronization/lock.h" 17 #include "base/synchronization/lock.h"
18 #include "base/time/time.h" 18 #include "base/time/time.h"
19 #include "base/trace_event/trace_event.h" 19 #include "base/trace_event/trace_event.h"
20 #include "base/values.h" 20 #include "base/values.h"
21 #include "net/base/ip_endpoint.h" 21 #include "net/base/ip_endpoint.h"
22 #include "net/base/net_errors.h" 22 #include "net/base/net_errors.h"
23 #include "net/base/socket_performance_watcher.h"
24 #include "net/base/socket_performance_watcher_factory.h"
23 #include "net/log/net_log.h" 25 #include "net/log/net_log.h"
24 #include "net/socket/client_socket_factory.h" 26 #include "net/socket/client_socket_factory.h"
25 #include "net/socket/client_socket_handle.h" 27 #include "net/socket/client_socket_handle.h"
26 #include "net/socket/client_socket_pool_base.h" 28 #include "net/socket/client_socket_pool_base.h"
27 #include "net/socket/socket_net_log_params.h" 29 #include "net/socket/socket_net_log_params.h"
28 #include "net/socket/tcp_client_socket.h" 30 #include "net/socket/tcp_client_socket.h"
29 31
30 using base::TimeDelta; 32 using base::TimeDelta;
31 33
32 namespace net { 34 namespace net {
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 return connect_duration; 195 return connect_duration;
194 } 196 }
195 197
196 TransportConnectJob::TransportConnectJob( 198 TransportConnectJob::TransportConnectJob(
197 const std::string& group_name, 199 const std::string& group_name,
198 RequestPriority priority, 200 RequestPriority priority,
199 ClientSocketPool::RespectLimits respect_limits, 201 ClientSocketPool::RespectLimits respect_limits,
200 const scoped_refptr<TransportSocketParams>& params, 202 const scoped_refptr<TransportSocketParams>& params,
201 base::TimeDelta timeout_duration, 203 base::TimeDelta timeout_duration,
202 ClientSocketFactory* client_socket_factory, 204 ClientSocketFactory* client_socket_factory,
205 SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
203 HostResolver* host_resolver, 206 HostResolver* host_resolver,
204 Delegate* delegate, 207 Delegate* delegate,
205 NetLog* net_log) 208 NetLog* net_log)
206 : ConnectJob(group_name, 209 : ConnectJob(group_name,
207 timeout_duration, 210 timeout_duration,
208 priority, 211 priority,
209 respect_limits, 212 respect_limits,
210 delegate, 213 delegate,
211 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), 214 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)),
212 helper_(params, client_socket_factory, host_resolver, &connect_timing_), 215 helper_(params, client_socket_factory, host_resolver, &connect_timing_),
216 socket_performance_watcher_factory_(socket_performance_watcher_factory),
213 interval_between_connects_(CONNECT_INTERVAL_GT_20MS), 217 interval_between_connects_(CONNECT_INTERVAL_GT_20MS),
214 resolve_result_(OK) { 218 resolve_result_(OK) {
215 helper_.SetOnIOComplete(this); 219 helper_.SetOnIOComplete(this);
216 } 220 }
217 221
218 TransportConnectJob::~TransportConnectJob() { 222 TransportConnectJob::~TransportConnectJob() {
219 // We don't worry about cancelling the host resolution and TCP connect, since 223 // We don't worry about cancelling the host resolution and TCP connect, since
220 // ~SingleRequestHostResolver and ~StreamSocket will take care of it. 224 // ~SingleRequestHostResolver and ~StreamSocket will take care of it.
221 } 225 }
222 226
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 if (interval <= 10) 293 if (interval <= 10)
290 interval_between_connects_ = CONNECT_INTERVAL_LE_10MS; 294 interval_between_connects_ = CONNECT_INTERVAL_LE_10MS;
291 else if (interval <= 20) 295 else if (interval <= 20)
292 interval_between_connects_ = CONNECT_INTERVAL_LE_20MS; 296 interval_between_connects_ = CONNECT_INTERVAL_LE_20MS;
293 else 297 else
294 interval_between_connects_ = CONNECT_INTERVAL_GT_20MS; 298 interval_between_connects_ = CONNECT_INTERVAL_GT_20MS;
295 } 299 }
296 300
297 helper_.set_next_state( 301 helper_.set_next_state(
298 TransportConnectJobHelper::STATE_TRANSPORT_CONNECT_COMPLETE); 302 TransportConnectJobHelper::STATE_TRANSPORT_CONNECT_COMPLETE);
303 // Create a |SocketPerformanceWatcher|, and pass the ownership.
304 scoped_ptr<SocketPerformanceWatcher> socket_performance_watcher;
305 if (socket_performance_watcher_factory_) {
306 socket_performance_watcher =
307 socket_performance_watcher_factory_->CreateSocketPerformanceWatcher(
308 SocketPerformanceWatcherFactory::PROTOCOL_TCP);
309 }
299 transport_socket_ = 310 transport_socket_ =
300 helper_.client_socket_factory()->CreateTransportClientSocket( 311 helper_.client_socket_factory()->CreateTransportClientSocket(
301 helper_.addresses(), net_log().net_log(), net_log().source()); 312 helper_.addresses(), std::move(socket_performance_watcher),
313 net_log().net_log(), net_log().source());
302 314
303 // If the list contains IPv6 and IPv4 addresses, the first address will 315 // If the list contains IPv6 and IPv4 addresses, the first address will
304 // be IPv6, and the IPv4 addresses will be tried as fallback addresses, 316 // be IPv6, and the IPv4 addresses will be tried as fallback addresses,
305 // per "Happy Eyeballs" (RFC 6555). 317 // per "Happy Eyeballs" (RFC 6555).
306 bool try_ipv6_connect_with_ipv4_fallback = 318 bool try_ipv6_connect_with_ipv4_fallback =
307 helper_.addresses().front().GetFamily() == ADDRESS_FAMILY_IPV6 && 319 helper_.addresses().front().GetFamily() == ADDRESS_FAMILY_IPV6 &&
308 !AddressListOnlyContainsIPv6(helper_.addresses()); 320 !AddressListOnlyContainsIPv6(helper_.addresses());
309 321
310 // Enable TCP FastOpen if indicated by transport socket params. 322 // Enable TCP FastOpen if indicated by transport socket params.
311 // Note: We currently do not turn on TCP FastOpen for destinations where 323 // Note: We currently do not turn on TCP FastOpen for destinations where
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 // succeed. 418 // succeed.
407 if (helper_.next_state() != 419 if (helper_.next_state() !=
408 TransportConnectJobHelper::STATE_TRANSPORT_CONNECT_COMPLETE) { 420 TransportConnectJobHelper::STATE_TRANSPORT_CONNECT_COMPLETE) {
409 NOTREACHED(); 421 NOTREACHED();
410 return; 422 return;
411 } 423 }
412 424
413 DCHECK(!fallback_transport_socket_.get()); 425 DCHECK(!fallback_transport_socket_.get());
414 DCHECK(!fallback_addresses_.get()); 426 DCHECK(!fallback_addresses_.get());
415 427
428 // Create a |SocketPerformanceWatcher|, and pass the ownership.
429 scoped_ptr<SocketPerformanceWatcher> socket_performance_watcher;
430 if (socket_performance_watcher_factory_) {
431 socket_performance_watcher =
432 socket_performance_watcher_factory_->CreateSocketPerformanceWatcher(
433 SocketPerformanceWatcherFactory::PROTOCOL_TCP);
434 }
435
416 fallback_addresses_.reset(new AddressList(helper_.addresses())); 436 fallback_addresses_.reset(new AddressList(helper_.addresses()));
417 MakeAddressListStartWithIPv4(fallback_addresses_.get()); 437 MakeAddressListStartWithIPv4(fallback_addresses_.get());
418 fallback_transport_socket_ = 438 fallback_transport_socket_ =
419 helper_.client_socket_factory()->CreateTransportClientSocket( 439 helper_.client_socket_factory()->CreateTransportClientSocket(
420 *fallback_addresses_, net_log().net_log(), net_log().source()); 440 *fallback_addresses_, std::move(socket_performance_watcher),
441 net_log().net_log(), net_log().source());
421 fallback_connect_start_time_ = base::TimeTicks::Now(); 442 fallback_connect_start_time_ = base::TimeTicks::Now();
422 int rv = fallback_transport_socket_->Connect( 443 int rv = fallback_transport_socket_->Connect(
423 base::Bind( 444 base::Bind(
424 &TransportConnectJob::DoIPv6FallbackTransportConnectComplete, 445 &TransportConnectJob::DoIPv6FallbackTransportConnectComplete,
425 base::Unretained(this))); 446 base::Unretained(this)));
426 if (rv != ERR_IO_PENDING) 447 if (rv != ERR_IO_PENDING)
427 DoIPv6FallbackTransportConnectComplete(rv); 448 DoIPv6FallbackTransportConnectComplete(rv);
428 } 449 }
429 450
430 void TransportConnectJob::DoIPv6FallbackTransportConnectComplete(int result) { 451 void TransportConnectJob::DoIPv6FallbackTransportConnectComplete(int result) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 } 506 }
486 507
487 scoped_ptr<ConnectJob> 508 scoped_ptr<ConnectJob>
488 TransportClientSocketPool::TransportConnectJobFactory::NewConnectJob( 509 TransportClientSocketPool::TransportConnectJobFactory::NewConnectJob(
489 const std::string& group_name, 510 const std::string& group_name,
490 const PoolBase::Request& request, 511 const PoolBase::Request& request,
491 ConnectJob::Delegate* delegate) const { 512 ConnectJob::Delegate* delegate) const {
492 return scoped_ptr<ConnectJob>(new TransportConnectJob( 513 return scoped_ptr<ConnectJob>(new TransportConnectJob(
493 group_name, request.priority(), request.respect_limits(), 514 group_name, request.priority(), request.respect_limits(),
494 request.params(), ConnectionTimeout(), client_socket_factory_, 515 request.params(), ConnectionTimeout(), client_socket_factory_,
495 host_resolver_, delegate, net_log_)); 516 socket_performance_watcher_factory_, host_resolver_, delegate, net_log_));
496 } 517 }
497 518
498 base::TimeDelta 519 base::TimeDelta
499 TransportClientSocketPool::TransportConnectJobFactory::ConnectionTimeout() 520 TransportClientSocketPool::TransportConnectJobFactory::ConnectionTimeout()
500 const { 521 const {
501 return base::TimeDelta::FromSeconds(kTransportConnectJobTimeoutInSeconds); 522 return base::TimeDelta::FromSeconds(kTransportConnectJobTimeoutInSeconds);
502 } 523 }
503 524
504 TransportClientSocketPool::TransportClientSocketPool( 525 TransportClientSocketPool::TransportClientSocketPool(
505 int max_sockets, 526 int max_sockets,
506 int max_sockets_per_group, 527 int max_sockets_per_group,
507 HostResolver* host_resolver, 528 HostResolver* host_resolver,
508 ClientSocketFactory* client_socket_factory, 529 ClientSocketFactory* client_socket_factory,
530 SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
509 NetLog* net_log) 531 NetLog* net_log)
510 : base_(NULL, 532 : base_(NULL,
511 max_sockets, 533 max_sockets,
512 max_sockets_per_group, 534 max_sockets_per_group,
513 ClientSocketPool::unused_idle_socket_timeout(), 535 ClientSocketPool::unused_idle_socket_timeout(),
514 ClientSocketPool::used_idle_socket_timeout(), 536 ClientSocketPool::used_idle_socket_timeout(),
515 new TransportConnectJobFactory(client_socket_factory, 537 new TransportConnectJobFactory(client_socket_factory,
516 host_resolver, 538 host_resolver,
539 socket_performance_watcher_factory,
517 net_log)) { 540 net_log)) {
518 base_.EnableConnectBackupJobs(); 541 base_.EnableConnectBackupJobs();
519 } 542 }
520 543
521 TransportClientSocketPool::~TransportClientSocketPool() {} 544 TransportClientSocketPool::~TransportClientSocketPool() {}
522 545
523 int TransportClientSocketPool::RequestSocket(const std::string& group_name, 546 int TransportClientSocketPool::RequestSocket(const std::string& group_name,
524 const void* params, 547 const void* params,
525 RequestPriority priority, 548 RequestPriority priority,
526 RespectLimits respect_limits, 549 RespectLimits respect_limits,
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 HigherLayeredPool* higher_pool) { 644 HigherLayeredPool* higher_pool) {
622 base_.AddHigherLayeredPool(higher_pool); 645 base_.AddHigherLayeredPool(higher_pool);
623 } 646 }
624 647
625 void TransportClientSocketPool::RemoveHigherLayeredPool( 648 void TransportClientSocketPool::RemoveHigherLayeredPool(
626 HigherLayeredPool* higher_pool) { 649 HigherLayeredPool* higher_pool) {
627 base_.RemoveHigherLayeredPool(higher_pool); 650 base_.RemoveHigherLayeredPool(higher_pool);
628 } 651 }
629 652
630 } // namespace net 653 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/transport_client_socket_pool.h ('k') | net/socket/transport_client_socket_pool_test_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698