| Index: net/base/network_quality_estimator.cc
|
| diff --git a/net/base/network_quality_estimator.cc b/net/base/network_quality_estimator.cc
|
| index dfc243ef490a0ff7106a9b08df97061f75aa468f..4be379b13e21455996b6745cc3ba1a4007b2be94 100644
|
| --- a/net/base/network_quality_estimator.cc
|
| +++ b/net/base/network_quality_estimator.cc
|
| @@ -11,10 +11,12 @@
|
| #include <utility>
|
| #include <vector>
|
|
|
| +#include "base/bind.h"
|
| #include "base/logging.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/metrics/histogram_base.h"
|
| #include "base/strings/string_number_conversions.h"
|
| +#include "base/thread_task_runner_handle.h"
|
| #include "build/build_config.h"
|
| #include "net/base/load_flags.h"
|
| #include "net/base/load_timing_info.h"
|
| @@ -141,7 +143,8 @@ NetworkQualityEstimator::NetworkQualityEstimator(
|
| downstream_throughput_kbps_observations_(
|
| GetWeightMultiplierPerSecond(variation_params)),
|
| rtt_observations_(GetWeightMultiplierPerSecond(variation_params)),
|
| - external_estimate_provider_(std::move(external_estimates_provider)) {
|
| + external_estimate_provider_(std::move(external_estimates_provider)),
|
| + weak_ptr_factory_(this) {
|
| static_assert(kMinRequestDurationMicroseconds > 0,
|
| "Minimum request duration must be > 0");
|
| static_assert(kDefaultHalfLifeSeconds > 0,
|
| @@ -166,6 +169,11 @@ NetworkQualityEstimator::NetworkQualityEstimator(
|
| }
|
| current_network_id_ = GetCurrentNetworkID();
|
| AddDefaultEstimates();
|
| +
|
| + watcher_factory_.reset(new SocketWatcherFactory(
|
| + base::ThreadTaskRunnerHandle::Get(),
|
| + base::Bind(&NetworkQualityEstimator::OnUpdatedRTTAvailable,
|
| + GetWeakPtr())));
|
| }
|
|
|
| // static
|
| @@ -376,6 +384,13 @@ void NetworkQualityEstimator::RemoveThroughputObserver(
|
| throughput_observer_list_.RemoveObserver(throughput_observer);
|
| }
|
|
|
| +SocketPerformanceWatcherFactory*
|
| +NetworkQualityEstimator::GetSocketPerformanceWatcherFactory() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + return watcher_factory_.get();
|
| +}
|
| +
|
| void NetworkQualityEstimator::RecordRTTUMA(int32_t estimated_value_msec,
|
| int32_t actual_value_msec) const {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| @@ -633,6 +648,39 @@ base::TimeDelta NetworkQualityEstimator::GetURLRequestRTTEstimateInternal(
|
| return rtt;
|
| }
|
|
|
| +NetworkQualityEstimator::SocketWatcherFactory::SocketWatcherFactory(
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| + RTTUpdateCallback rtt_update_callback)
|
| + : task_runner_(task_runner),
|
| + rtt_update_callback_(rtt_update_callback),
|
| + weak_ptr_factory_(this) {
|
| + DCHECK(task_runner_);
|
| +}
|
| +
|
| +NetworkQualityEstimator::SocketWatcherFactory::~SocketWatcherFactory() {}
|
| +
|
| +scoped_ptr<SocketPerformanceWatcher>
|
| +NetworkQualityEstimator::SocketWatcherFactory::CreateSocketPerformanceWatcher(
|
| + const Protocol protocol) {
|
| + return scoped_ptr<SocketPerformanceWatcher>(new SocketPerformanceWatcher(
|
| + protocol, base::Bind(&SocketWatcherFactory::OnUpdatedRTTAvailable,
|
| + weak_ptr_factory_.GetWeakPtr()),
|
| + base::Bind(&SocketWatcherFactory::OnWatcherReset,
|
| + weak_ptr_factory_.GetWeakPtr())));
|
| +}
|
| +
|
| +void NetworkQualityEstimator::SocketWatcherFactory::OnUpdatedRTTAvailable(
|
| + const Protocol protocol,
|
| + const base::TimeDelta& rtt) {
|
| + task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(rtt_update_callback_, protocol, rtt));
|
| +}
|
| +
|
| +void NetworkQualityEstimator::SocketWatcherFactory::OnWatcherReset() {
|
| + // Nothing needs to be done for RTT observations since SocketWatcherFactory
|
| + // does not maintain any watcher-specific state.
|
| +}
|
| +
|
| int32_t NetworkQualityEstimator::GetDownlinkThroughputKbpsEstimateInternal(
|
| const base::TimeTicks& begin_timestamp,
|
| int percentile) const {
|
| @@ -904,25 +952,16 @@ void NetworkQualityEstimator::CacheNetworkQualityEstimate() {
|
| static_cast<size_t>(kMaximumNetworkQualityCacheSize));
|
| }
|
|
|
| -scoped_ptr<SocketPerformanceWatcher>
|
| -NetworkQualityEstimator::CreateSocketPerformanceWatcher(
|
| - const Protocol protocol) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - return scoped_ptr<SocketPerformanceWatcher>(
|
| - new SocketPerformanceWatcher(protocol, this));
|
| -}
|
| -
|
| void NetworkQualityEstimator::OnUpdatedRTTAvailable(
|
| - const Protocol protocol,
|
| + SocketPerformanceWatcherFactory::Protocol protocol,
|
| const base::TimeDelta& rtt) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| switch (protocol) {
|
| - case PROTOCOL_TCP:
|
| + case SocketPerformanceWatcherFactory::PROTOCOL_TCP:
|
| NotifyObserversOfRTT(RttObservation(rtt, base::TimeTicks::Now(), TCP));
|
| return;
|
| - case PROTOCOL_QUIC:
|
| + case SocketPerformanceWatcherFactory::PROTOCOL_QUIC:
|
| NotifyObserversOfRTT(RttObservation(rtt, base::TimeTicks::Now(), QUIC));
|
| return;
|
| default:
|
| @@ -946,6 +985,12 @@ void NetworkQualityEstimator::NotifyObserversOfThroughput(
|
| observation.source));
|
| }
|
|
|
| +base::WeakPtr<NetworkQualityEstimator> NetworkQualityEstimator::GetWeakPtr() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + return weak_ptr_factory_.GetWeakPtr();
|
| +}
|
| +
|
| NetworkQualityEstimator::CachedNetworkQuality::CachedNetworkQuality(
|
| const NetworkQuality& network_quality)
|
| : last_update_time_(base::TimeTicks::Now()),
|
|
|