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

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: Created 5 years, 2 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 8
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "base/metrics/histogram_macros.h" 13 #include "base/metrics/histogram_macros.h"
14 #include "base/profiler/scoped_tracker.h" 14 #include "base/profiler/scoped_tracker.h"
15 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
16 #include "base/synchronization/lock.h" 16 #include "base/synchronization/lock.h"
17 #include "base/time/time.h" 17 #include "base/time/time.h"
18 #include "base/values.h" 18 #include "base/values.h"
19 #include "net/base/ip_endpoint.h" 19 #include "net/base/ip_endpoint.h"
20 #include "net/base/net_errors.h" 20 #include "net/base/net_errors.h"
21 #include "net/base/socket_performance_watcher_factory.h"
21 #include "net/log/net_log.h" 22 #include "net/log/net_log.h"
22 #include "net/socket/client_socket_factory.h" 23 #include "net/socket/client_socket_factory.h"
23 #include "net/socket/client_socket_handle.h" 24 #include "net/socket/client_socket_handle.h"
24 #include "net/socket/client_socket_pool_base.h" 25 #include "net/socket/client_socket_pool_base.h"
25 #include "net/socket/socket_net_log_params.h" 26 #include "net/socket/socket_net_log_params.h"
26 #include "net/socket/tcp_client_socket.h" 27 #include "net/socket/tcp_client_socket.h"
27 28
28 using base::TimeDelta; 29 using base::TimeDelta;
29 30
30 namespace net { 31 namespace net {
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 192
192 return connect_duration; 193 return connect_duration;
193 } 194 }
194 195
195 TransportConnectJob::TransportConnectJob( 196 TransportConnectJob::TransportConnectJob(
196 const std::string& group_name, 197 const std::string& group_name,
197 RequestPriority priority, 198 RequestPriority priority,
198 const scoped_refptr<TransportSocketParams>& params, 199 const scoped_refptr<TransportSocketParams>& params,
199 base::TimeDelta timeout_duration, 200 base::TimeDelta timeout_duration,
200 ClientSocketFactory* client_socket_factory, 201 ClientSocketFactory* client_socket_factory,
202 const SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
201 HostResolver* host_resolver, 203 HostResolver* host_resolver,
202 Delegate* delegate, 204 Delegate* delegate,
203 NetLog* net_log) 205 NetLog* net_log)
204 : ConnectJob(group_name, 206 : ConnectJob(group_name,
205 timeout_duration, 207 timeout_duration,
206 priority, 208 priority,
207 delegate, 209 delegate,
208 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), 210 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)),
209 helper_(params, client_socket_factory, host_resolver, &connect_timing_), 211 helper_(params, client_socket_factory, host_resolver, &connect_timing_),
212 socket_performance_watcher_factory_(socket_performance_watcher_factory),
210 interval_between_connects_(CONNECT_INTERVAL_GT_20MS), 213 interval_between_connects_(CONNECT_INTERVAL_GT_20MS),
211 resolve_result_(OK) { 214 resolve_result_(OK) {
212 helper_.SetOnIOComplete(this); 215 helper_.SetOnIOComplete(this);
213 } 216 }
214 217
215 TransportConnectJob::~TransportConnectJob() { 218 TransportConnectJob::~TransportConnectJob() {
216 // We don't worry about cancelling the host resolution and TCP connect, since 219 // We don't worry about cancelling the host resolution and TCP connect, since
217 // ~SingleRequestHostResolver and ~StreamSocket will take care of it. 220 // ~SingleRequestHostResolver and ~StreamSocket will take care of it.
218 } 221 }
219 222
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 else if (interval <= 20) 291 else if (interval <= 20)
289 interval_between_connects_ = CONNECT_INTERVAL_LE_20MS; 292 interval_between_connects_ = CONNECT_INTERVAL_LE_20MS;
290 else 293 else
291 interval_between_connects_ = CONNECT_INTERVAL_GT_20MS; 294 interval_between_connects_ = CONNECT_INTERVAL_GT_20MS;
292 } 295 }
293 296
294 helper_.set_next_state( 297 helper_.set_next_state(
295 TransportConnectJobHelper::STATE_TRANSPORT_CONNECT_COMPLETE); 298 TransportConnectJobHelper::STATE_TRANSPORT_CONNECT_COMPLETE);
296 transport_socket_ = 299 transport_socket_ =
297 helper_.client_socket_factory()->CreateTransportClientSocket( 300 helper_.client_socket_factory()->CreateTransportClientSocket(
298 helper_.addresses(), net_log().net_log(), net_log().source()); 301 helper_.addresses(), socket_performance_watcher_factory_,
302 net_log().net_log(), net_log().source());
299 303
300 // If the list contains IPv6 and IPv4 addresses, the first address will 304 // If the list contains IPv6 and IPv4 addresses, the first address will
301 // be IPv6, and the IPv4 addresses will be tried as fallback addresses, 305 // be IPv6, and the IPv4 addresses will be tried as fallback addresses,
302 // per "Happy Eyeballs" (RFC 6555). 306 // per "Happy Eyeballs" (RFC 6555).
303 bool try_ipv6_connect_with_ipv4_fallback = 307 bool try_ipv6_connect_with_ipv4_fallback =
304 helper_.addresses().front().GetFamily() == ADDRESS_FAMILY_IPV6 && 308 helper_.addresses().front().GetFamily() == ADDRESS_FAMILY_IPV6 &&
305 !AddressListOnlyContainsIPv6(helper_.addresses()); 309 !AddressListOnlyContainsIPv6(helper_.addresses());
306 310
307 // Enable TCP FastOpen if indicated by transport socket params. 311 // Enable TCP FastOpen if indicated by transport socket params.
308 // Note: We currently do not turn on TCP FastOpen for destinations where 312 // Note: We currently do not turn on TCP FastOpen for destinations where
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 return; 411 return;
408 } 412 }
409 413
410 DCHECK(!fallback_transport_socket_.get()); 414 DCHECK(!fallback_transport_socket_.get());
411 DCHECK(!fallback_addresses_.get()); 415 DCHECK(!fallback_addresses_.get());
412 416
413 fallback_addresses_.reset(new AddressList(helper_.addresses())); 417 fallback_addresses_.reset(new AddressList(helper_.addresses()));
414 MakeAddressListStartWithIPv4(fallback_addresses_.get()); 418 MakeAddressListStartWithIPv4(fallback_addresses_.get());
415 fallback_transport_socket_ = 419 fallback_transport_socket_ =
416 helper_.client_socket_factory()->CreateTransportClientSocket( 420 helper_.client_socket_factory()->CreateTransportClientSocket(
417 *fallback_addresses_, net_log().net_log(), net_log().source()); 421 *fallback_addresses_, socket_performance_watcher_factory_,
422 net_log().net_log(), net_log().source());
418 fallback_connect_start_time_ = base::TimeTicks::Now(); 423 fallback_connect_start_time_ = base::TimeTicks::Now();
419 int rv = fallback_transport_socket_->Connect( 424 int rv = fallback_transport_socket_->Connect(
420 base::Bind( 425 base::Bind(
421 &TransportConnectJob::DoIPv6FallbackTransportConnectComplete, 426 &TransportConnectJob::DoIPv6FallbackTransportConnectComplete,
422 base::Unretained(this))); 427 base::Unretained(this)));
423 if (rv != ERR_IO_PENDING) 428 if (rv != ERR_IO_PENDING)
424 DoIPv6FallbackTransportConnectComplete(rv); 429 DoIPv6FallbackTransportConnectComplete(rv);
425 } 430 }
426 431
427 void TransportConnectJob::DoIPv6FallbackTransportConnectComplete(int result) { 432 void TransportConnectJob::DoIPv6FallbackTransportConnectComplete(int result) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 fallback_transport_socket_->GetConnectionAttempts( 484 fallback_transport_socket_->GetConnectionAttempts(
480 &fallback_connection_attempts_); 485 &fallback_connection_attempts_);
481 } 486 }
482 } 487 }
483 488
484 scoped_ptr<ConnectJob> 489 scoped_ptr<ConnectJob>
485 TransportClientSocketPool::TransportConnectJobFactory::NewConnectJob( 490 TransportClientSocketPool::TransportConnectJobFactory::NewConnectJob(
486 const std::string& group_name, 491 const std::string& group_name,
487 const PoolBase::Request& request, 492 const PoolBase::Request& request,
488 ConnectJob::Delegate* delegate) const { 493 ConnectJob::Delegate* delegate) const {
489 return scoped_ptr<ConnectJob>( 494 return scoped_ptr<ConnectJob>(new TransportConnectJob(
490 new TransportConnectJob(group_name, 495 group_name, request.priority(), request.params(), ConnectionTimeout(),
491 request.priority(), 496 client_socket_factory_, socket_performance_watcher_factory_,
492 request.params(), 497 host_resolver_, delegate, net_log_));
493 ConnectionTimeout(),
494 client_socket_factory_,
495 host_resolver_,
496 delegate,
497 net_log_));
498 } 498 }
499 499
500 base::TimeDelta 500 base::TimeDelta
501 TransportClientSocketPool::TransportConnectJobFactory::ConnectionTimeout() 501 TransportClientSocketPool::TransportConnectJobFactory::ConnectionTimeout()
502 const { 502 const {
503 return base::TimeDelta::FromSeconds(kTransportConnectJobTimeoutInSeconds); 503 return base::TimeDelta::FromSeconds(kTransportConnectJobTimeoutInSeconds);
504 } 504 }
505 505
506 TransportClientSocketPool::TransportClientSocketPool( 506 TransportClientSocketPool::TransportClientSocketPool(
507 int max_sockets, 507 int max_sockets,
508 int max_sockets_per_group, 508 int max_sockets_per_group,
509 HostResolver* host_resolver, 509 HostResolver* host_resolver,
510 ClientSocketFactory* client_socket_factory, 510 ClientSocketFactory* client_socket_factory,
511 const SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
511 NetLog* net_log) 512 NetLog* net_log)
512 : base_(NULL, 513 : base_(NULL,
513 max_sockets, 514 max_sockets,
514 max_sockets_per_group, 515 max_sockets_per_group,
515 ClientSocketPool::unused_idle_socket_timeout(), 516 ClientSocketPool::unused_idle_socket_timeout(),
516 ClientSocketPool::used_idle_socket_timeout(), 517 ClientSocketPool::used_idle_socket_timeout(),
517 new TransportConnectJobFactory(client_socket_factory, 518 new TransportConnectJobFactory(client_socket_factory,
519 socket_performance_watcher_factory,
518 host_resolver, 520 host_resolver,
519 net_log)) { 521 net_log)) {
520 base_.EnableConnectBackupJobs(); 522 base_.EnableConnectBackupJobs();
521 } 523 }
522 524
523 TransportClientSocketPool::~TransportClientSocketPool() {} 525 TransportClientSocketPool::~TransportClientSocketPool() {}
524 526
525 int TransportClientSocketPool::RequestSocket( 527 int TransportClientSocketPool::RequestSocket(
526 const std::string& group_name, 528 const std::string& group_name,
527 const void* params, 529 const void* params,
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 HigherLayeredPool* higher_pool) { 625 HigherLayeredPool* higher_pool) {
624 base_.AddHigherLayeredPool(higher_pool); 626 base_.AddHigherLayeredPool(higher_pool);
625 } 627 }
626 628
627 void TransportClientSocketPool::RemoveHigherLayeredPool( 629 void TransportClientSocketPool::RemoveHigherLayeredPool(
628 HigherLayeredPool* higher_pool) { 630 HigherLayeredPool* higher_pool) {
629 base_.RemoveHigherLayeredPool(higher_pool); 631 base_.RemoveHigherLayeredPool(higher_pool);
630 } 632 }
631 633
632 } // namespace net 634 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698