diff options
Diffstat (limited to 'chromium/net/socket/transport_client_socket_pool.cc')
-rw-r--r-- | chromium/net/socket/transport_client_socket_pool.cc | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/chromium/net/socket/transport_client_socket_pool.cc b/chromium/net/socket/transport_client_socket_pool.cc index d03e3e651ac..ec56dcba65c 100644 --- a/chromium/net/socket/transport_client_socket_pool.cc +++ b/chromium/net/socket/transport_client_socket_pool.cc @@ -7,10 +7,12 @@ #include <algorithm> #include "base/compiler_specific.h" +#include "base/lazy_instance.h" #include "base/logging.h" #include "base/message_loop/message_loop.h" #include "base/metrics/histogram.h" #include "base/strings/string_util.h" +#include "base/synchronization/lock.h" #include "base/time/time.h" #include "base/values.h" #include "net/base/ip_endpoint.h" @@ -46,6 +48,14 @@ bool AddressListOnlyContainsIPv6(const AddressList& list) { } // namespace +// This lock protects |g_last_connect_time|. +static base::LazyInstance<base::Lock>::Leaky + g_last_connect_time_lock = LAZY_INSTANCE_INITIALIZER; + +// |g_last_connect_time| has the last time a connect() call is made. +static base::LazyInstance<base::TimeTicks>::Leaky + g_last_connect_time = LAZY_INSTANCE_INITIALIZER; + TransportSocketParams::TransportSocketParams( const HostPortPair& host_port_pair, bool disable_resolver_cache, @@ -85,7 +95,8 @@ TransportConnectJob::TransportConnectJob( params_(params), client_socket_factory_(client_socket_factory), resolver_(host_resolver), - next_state_(STATE_NONE) { + next_state_(STATE_NONE), + interval_between_connects_(CONNECT_INTERVAL_GT_20MS) { } TransportConnectJob::~TransportConnectJob() { @@ -186,6 +197,25 @@ int TransportConnectJob::DoResolveHostComplete(int result) { } int TransportConnectJob::DoTransportConnect() { + base::TimeTicks now = base::TimeTicks::Now(); + base::TimeTicks last_connect_time; + { + base::AutoLock lock(g_last_connect_time_lock.Get()); + last_connect_time = g_last_connect_time.Get(); + *g_last_connect_time.Pointer() = now; + } + if (last_connect_time.is_null()) { + interval_between_connects_ = CONNECT_INTERVAL_GT_20MS; + } else { + int64 interval = (now - last_connect_time).InMilliseconds(); + if (interval <= 10) + interval_between_connects_ = CONNECT_INTERVAL_LE_10MS; + else if (interval <= 20) + interval_between_connects_ = CONNECT_INTERVAL_LE_20MS; + else + interval_between_connects_ = CONNECT_INTERVAL_GT_20MS; + } + next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; transport_socket_ = client_socket_factory_->CreateTransportClientSocket( addresses_, net_log().net_log(), net_log().source()); @@ -222,6 +252,36 @@ int TransportConnectJob::DoTransportConnectComplete(int result) { base::TimeDelta::FromMinutes(10), 100); + switch (interval_between_connects_) { + case CONNECT_INTERVAL_LE_10MS: + UMA_HISTOGRAM_CUSTOM_TIMES( + "Net.TCP_Connection_Latency_Interval_LessThanOrEqual_10ms", + connect_duration, + base::TimeDelta::FromMilliseconds(1), + base::TimeDelta::FromMinutes(10), + 100); + break; + case CONNECT_INTERVAL_LE_20MS: + UMA_HISTOGRAM_CUSTOM_TIMES( + "Net.TCP_Connection_Latency_Interval_LessThanOrEqual_20ms", + connect_duration, + base::TimeDelta::FromMilliseconds(1), + base::TimeDelta::FromMinutes(10), + 100); + break; + case CONNECT_INTERVAL_GT_20MS: + UMA_HISTOGRAM_CUSTOM_TIMES( + "Net.TCP_Connection_Latency_Interval_GreaterThan_20ms", + connect_duration, + base::TimeDelta::FromMilliseconds(1), + base::TimeDelta::FromMinutes(10), + 100); + break; + default: + NOTREACHED(); + break; + } + if (is_ipv4) { UMA_HISTOGRAM_CUSTOM_TIMES("Net.TCP_Connection_Latency_IPv4_No_Race", connect_duration, |