| Index: net/socket/tcp_socket_posix.cc
|
| diff --git a/net/socket/tcp_socket_posix.cc b/net/socket/tcp_socket_posix.cc
|
| index 95fe6b5bd011b8f96f5f8ac321974b0f2ddd0841..70dbd0d25d96eaa780abb7bf49d0d8ddadfbc19f 100644
|
| --- a/net/socket/tcp_socket_posix.cc
|
| +++ b/net/socket/tcp_socket_posix.cc
|
| @@ -14,6 +14,7 @@
|
| #include "base/logging.h"
|
| #include "base/metrics/histogram_macros.h"
|
| #include "base/posix/eintr_wrapper.h"
|
| +#include "base/profiler/scoped_tracker.h"
|
| #include "base/task_runner_util.h"
|
| #include "base/threading/worker_pool.h"
|
| #include "net/base/address_list.h"
|
| @@ -136,8 +137,12 @@ void CheckSupportAndMaybeEnableTCPFastOpen(bool user_enabled) {
|
| #endif
|
| }
|
|
|
| -TCPSocketPosix::TCPSocketPosix(NetLog* net_log, const NetLog::Source& source)
|
| - : use_tcp_fastopen_(false),
|
| +TCPSocketPosix::TCPSocketPosix(
|
| + scoped_ptr<SocketPerformanceWatcher> socket_performance_watcher,
|
| + NetLog* net_log,
|
| + const NetLog::Source& source)
|
| + : socket_performance_watcher_(std::move(socket_performance_watcher)),
|
| + use_tcp_fastopen_(false),
|
| tcp_fastopen_write_attempted_(false),
|
| tcp_fastopen_connected_(false),
|
| tcp_fastopen_status_(TCP_FASTOPEN_STATUS_UNKNOWN),
|
| @@ -510,14 +515,16 @@ int TCPSocketPosix::BuildTcpSocketPosix(scoped_ptr<TCPSocketPosix>* tcp_socket,
|
| return ERR_ADDRESS_INVALID;
|
| }
|
|
|
| - tcp_socket->reset(new TCPSocketPosix(net_log_.net_log(), net_log_.source()));
|
| + tcp_socket->reset(
|
| + new TCPSocketPosix(nullptr, net_log_.net_log(), net_log_.source()));
|
| (*tcp_socket)->socket_.reset(accept_socket_.release());
|
| return OK;
|
| }
|
|
|
| void TCPSocketPosix::ConnectCompleted(const CompletionCallback& callback,
|
| - int rv) const {
|
| + int rv) {
|
| DCHECK_NE(ERR_IO_PENDING, rv);
|
| + NotifySocketPerformanceWatcher();
|
| callback.Run(HandleConnectCompleted(rv));
|
| }
|
|
|
| @@ -571,6 +578,7 @@ void TCPSocketPosix::ReadCompleted(const scoped_refptr<IOBuffer>& buf,
|
| const CompletionCallback& callback,
|
| int rv) {
|
| DCHECK_NE(ERR_IO_PENDING, rv);
|
| + NotifySocketPerformanceWatcher();
|
| callback.Run(HandleReadCompleted(buf.get(), rv));
|
| }
|
|
|
| @@ -608,6 +616,7 @@ void TCPSocketPosix::WriteCompleted(const scoped_refptr<IOBuffer>& buf,
|
| const CompletionCallback& callback,
|
| int rv) {
|
| DCHECK_NE(ERR_IO_PENDING, rv);
|
| + NotifySocketPerformanceWatcher();
|
| callback.Run(HandleWriteCompleted(buf.get(), rv));
|
| }
|
|
|
| @@ -695,6 +704,37 @@ int TCPSocketPosix::TcpFastOpenWrite(IOBuffer* buf,
|
| return socket_->WaitForWrite(buf, buf_len, callback);
|
| }
|
|
|
| +void TCPSocketPosix::NotifySocketPerformanceWatcher() {
|
| +#if defined(TCP_INFO)
|
| + // TODO(tbansal): Remove ScopedTracker once crbug.com/590254 is fixed.
|
| + tracked_objects::ScopedTracker tracking_profile(
|
| + FROM_HERE_WITH_EXPLICIT_FUNCTION(
|
| + "590254 TCPSocketPosix::NotifySocketPerformanceWatcher"));
|
| +
|
| + // Check if |socket_performance_watcher_| is interested in receiving a RTT
|
| + // update notification.
|
| + if (!socket_performance_watcher_ ||
|
| + !socket_performance_watcher_->ShouldNotifyUpdatedRTT()) {
|
| + return;
|
| + }
|
| +
|
| + tcp_info info;
|
| + if (!GetTcpInfo(socket_->socket_fd(), &info))
|
| + return;
|
| +
|
| + // Only notify the |socket_performance_watcher_| if the RTT in |tcp_info|
|
| + // struct was populated. A value of 0 may be valid in certain cases
|
| + // (on very fast networks), but it is discarded. This means that
|
| + // some of the RTT values may be missed, but the values that are kept are
|
| + // guaranteed to be correct.
|
| + if (info.tcpi_rtt == 0 && info.tcpi_rttvar == 0)
|
| + return;
|
| +
|
| + socket_performance_watcher_->OnUpdatedRTTAvailable(
|
| + base::TimeDelta::FromMicroseconds(info.tcpi_rtt));
|
| +#endif // defined(TCP_INFO)
|
| +}
|
| +
|
| void TCPSocketPosix::UpdateTCPFastOpenStatusAfterRead() {
|
| DCHECK(tcp_fastopen_status_ == TCP_FASTOPEN_FAST_CONNECT_RETURN ||
|
| tcp_fastopen_status_ == TCP_FASTOPEN_SLOW_CONNECT_RETURN);
|
|
|