| Index: net/base/host_resolver_impl.cc
|
| diff --git a/net/base/host_resolver_impl.cc b/net/base/host_resolver_impl.cc
|
| index 89d657b1828755d732d51f5507cbc7edd285e6b9..b8f5d92f281a9e6a38dc76cd45a674e30a87e736 100644
|
| --- a/net/base/host_resolver_impl.cc
|
| +++ b/net/base/host_resolver_impl.cc
|
| @@ -236,42 +236,6 @@ AddressList EnsurePortOnAddressList(const AddressList& list, uint16 port) {
|
| return AddressList::CopyWithPort(list, port);
|
| }
|
|
|
| -// Wraps a call to HaveOnlyLoopbackAddresses to be executed on the WorkerPool as
|
| -// it takes 40-100ms and should not block initialization.
|
| -class HaveOnlyLoopbackProbeJob
|
| - : public base::RefCountedThreadSafe<HaveOnlyLoopbackProbeJob> {
|
| - public:
|
| - typedef base::Callback<void(bool)> CallbackType;
|
| - explicit HaveOnlyLoopbackProbeJob(const CallbackType& callback)
|
| - : result_(false) {
|
| - const bool kIsSlow = true;
|
| - base::WorkerPool::PostTaskAndReply(
|
| - FROM_HERE,
|
| - base::Bind(&HaveOnlyLoopbackProbeJob::DoProbe, this),
|
| - base::Bind(&HaveOnlyLoopbackProbeJob::OnProbeComplete, this, callback),
|
| - kIsSlow);
|
| - }
|
| -
|
| - private:
|
| - friend class base::RefCountedThreadSafe<HaveOnlyLoopbackProbeJob>;
|
| -
|
| - virtual ~HaveOnlyLoopbackProbeJob() {}
|
| -
|
| - // Runs on worker thread.
|
| - void DoProbe() {
|
| - result_ = HaveOnlyLoopbackAddresses();
|
| - }
|
| -
|
| - void OnProbeComplete(const CallbackType& callback) {
|
| - callback.Run(result_);
|
| - }
|
| -
|
| - bool result_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(HaveOnlyLoopbackProbeJob);
|
| -};
|
| -
|
| -
|
| // Creates NetLog parameters when the resolve failed.
|
| base::Value* NetLogProcTaskFailedCallback(uint32 attempt_number,
|
| int net_error,
|
| @@ -918,87 +882,89 @@ class HostResolverImpl::ProcTask
|
|
|
| //-----------------------------------------------------------------------------
|
|
|
| -// Represents a request to the worker pool for a "probe for IPv6 support" call.
|
| -//
|
| -// TODO(szym): This could also be replaced with PostTaskAndReply and Callbacks.
|
| -class HostResolverImpl::IPv6ProbeJob
|
| - : public base::RefCountedThreadSafe<HostResolverImpl::IPv6ProbeJob> {
|
| +// Wraps a call to TestIPv6Support to be executed on the WorkerPool as it takes
|
| +// 40-100ms.
|
| +class HostResolverImpl::IPv6ProbeJob {
|
| public:
|
| - IPv6ProbeJob(HostResolverImpl* resolver, NetLog* net_log)
|
| + IPv6ProbeJob(const base::WeakPtr<HostResolverImpl>& resolver, NetLog* net_log)
|
| : resolver_(resolver),
|
| - origin_loop_(base::MessageLoopProxy::current()),
|
| - net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_IPV6_PROBE_JOB)) {
|
| + net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_IPV6_PROBE_JOB)),
|
| + result_(false, IPV6_SUPPORT_MAX, OK) {
|
| DCHECK(resolver);
|
| - }
|
| -
|
| - void Start() {
|
| - DCHECK(origin_loop_->BelongsToCurrentThread());
|
| - if (was_canceled())
|
| - return;
|
| net_log_.BeginEvent(NetLog::TYPE_IPV6_PROBE_RUNNING);
|
| const bool kIsSlow = true;
|
| - base::WorkerPool::PostTask(
|
| - FROM_HERE, base::Bind(&IPv6ProbeJob::DoProbe, this), kIsSlow);
|
| + base::WorkerPool::PostTaskAndReply(
|
| + FROM_HERE,
|
| + base::Bind(&IPv6ProbeJob::DoProbe, base::Unretained(this)),
|
| + base::Bind(&IPv6ProbeJob::OnProbeComplete, base::Owned(this)),
|
| + kIsSlow);
|
| }
|
|
|
| - // Cancels the current job.
|
| - void Cancel() {
|
| - DCHECK(origin_loop_->BelongsToCurrentThread());
|
| - if (was_canceled())
|
| - return;
|
| - net_log_.AddEvent(NetLog::TYPE_CANCELLED);
|
| - resolver_ = NULL; // Read/write ONLY on origin thread.
|
| - }
|
| + virtual ~IPv6ProbeJob() {}
|
|
|
| private:
|
| - friend class base::RefCountedThreadSafe<HostResolverImpl::IPv6ProbeJob>;
|
| -
|
| - ~IPv6ProbeJob() {
|
| + // Runs on worker thread.
|
| + void DoProbe() {
|
| + result_ = TestIPv6Support();
|
| }
|
|
|
| - // Returns true if cancelled or if probe results have already been received
|
| - // on the origin thread.
|
| - bool was_canceled() const {
|
| - DCHECK(origin_loop_->BelongsToCurrentThread());
|
| - return !resolver_;
|
| + void OnProbeComplete() {
|
| + net_log_.EndEvent(NetLog::TYPE_IPV6_PROBE_RUNNING,
|
| + base::Bind(&IPv6SupportResult::ToNetLogValue,
|
| + base::Unretained(&result_)));
|
| + if (!resolver_)
|
| + return;
|
| + resolver_->IPv6ProbeSetDefaultAddressFamily(
|
| + result_.ipv6_supported ? ADDRESS_FAMILY_UNSPECIFIED
|
| + : ADDRESS_FAMILY_IPV4);
|
| }
|
|
|
| - // Run on worker thread.
|
| - void DoProbe() {
|
| - // Do actual testing on this thread, as it takes 40-100ms.
|
| - origin_loop_->PostTask(
|
| + // Used/set only on origin thread.
|
| + base::WeakPtr<HostResolverImpl> resolver_;
|
| +
|
| + BoundNetLog net_log_;
|
| +
|
| + IPv6SupportResult result_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(IPv6ProbeJob);
|
| +};
|
| +
|
| +// Wraps a call to HaveOnlyLoopbackAddresses to be executed on the WorkerPool as
|
| +// it takes 40-100ms and should not block initialization.
|
| +class HostResolverImpl::LoopbackProbeJob {
|
| + public:
|
| + explicit LoopbackProbeJob(const base::WeakPtr<HostResolverImpl>& resolver)
|
| + : resolver_(resolver),
|
| + result_(false) {
|
| + DCHECK(resolver);
|
| + const bool kIsSlow = true;
|
| + base::WorkerPool::PostTaskAndReply(
|
| FROM_HERE,
|
| - base::Bind(&IPv6ProbeJob::OnProbeComplete, this, TestIPv6Support()));
|
| + base::Bind(&LoopbackProbeJob::DoProbe, base::Unretained(this)),
|
| + base::Bind(&LoopbackProbeJob::OnProbeComplete, base::Owned(this)),
|
| + kIsSlow);
|
| }
|
|
|
| - // Callback for when DoProbe() completes.
|
| - void OnProbeComplete(const IPv6SupportResult& support_result) {
|
| - DCHECK(origin_loop_->BelongsToCurrentThread());
|
| - net_log_.EndEvent(
|
| - NetLog::TYPE_IPV6_PROBE_RUNNING,
|
| - base::Bind(&IPv6SupportResult::ToNetLogValue,
|
| - base::Unretained(&support_result)));
|
| - if (was_canceled())
|
| - return;
|
| + virtual ~LoopbackProbeJob() {}
|
|
|
| - // Clear |resolver_| so that no cancel event is logged.
|
| - HostResolverImpl* resolver = resolver_;
|
| - resolver_ = NULL;
|
| + private:
|
| + // Runs on worker thread.
|
| + void DoProbe() {
|
| + result_ = HaveOnlyLoopbackAddresses();
|
| + }
|
|
|
| - resolver->IPv6ProbeSetDefaultAddressFamily(
|
| - support_result.ipv6_supported ? ADDRESS_FAMILY_UNSPECIFIED
|
| - : ADDRESS_FAMILY_IPV4);
|
| + void OnProbeComplete() {
|
| + if (!resolver_)
|
| + return;
|
| + resolver_->SetHaveOnlyLoopbackAddresses(result_);
|
| }
|
|
|
| // Used/set only on origin thread.
|
| - HostResolverImpl* resolver_;
|
| -
|
| - // Used to post ourselves onto the origin thread.
|
| - scoped_refptr<base::MessageLoopProxy> origin_loop_;
|
| + base::WeakPtr<HostResolverImpl> resolver_;
|
|
|
| - BoundNetLog net_log_;
|
| + bool result_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(IPv6ProbeJob);
|
| + DISALLOW_COPY_AND_ASSIGN(LoopbackProbeJob);
|
| };
|
|
|
| //-----------------------------------------------------------------------------
|
| @@ -1181,11 +1147,11 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job {
|
| public:
|
| // Creates new job for |key| where |request_net_log| is bound to the
|
| // request that spawned it.
|
| - Job(HostResolverImpl* resolver,
|
| + Job(const base::WeakPtr<HostResolverImpl>& resolver,
|
| const Key& key,
|
| RequestPriority priority,
|
| const BoundNetLog& request_net_log)
|
| - : resolver_(resolver->weak_ptr_factory_.GetWeakPtr()),
|
| + : resolver_(resolver),
|
| key_(key),
|
| priority_tracker_(priority),
|
| had_non_speculative_request_(false),
|
| @@ -1661,6 +1627,7 @@ HostResolverImpl::HostResolverImpl(
|
| proc_params_(proc_params),
|
| default_address_family_(ADDRESS_FAMILY_UNSPECIFIED),
|
| weak_ptr_factory_(this),
|
| + probe_weak_ptr_factory_(this),
|
| dns_client_(dns_client.Pass()),
|
| received_dns_config_(false),
|
| ipv6_probe_monitoring_(false),
|
| @@ -1679,9 +1646,7 @@ HostResolverImpl::HostResolverImpl(
|
| EnsureWinsockInit();
|
| #endif
|
| #if defined(OS_POSIX) && !defined(OS_MACOSX)
|
| - new HaveOnlyLoopbackProbeJob(
|
| - base::Bind(&HostResolverImpl::SetHaveOnlyLoopbackAddresses,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| + new LoopbackProbeJob(weak_ptr_factory_.GetWeakPtr());
|
| #endif
|
| NetworkChangeNotifier::AddIPAddressObserver(this);
|
| NetworkChangeNotifier::AddDNSObserver(this);
|
| @@ -1694,8 +1659,6 @@ HostResolverImpl::HostResolverImpl(
|
| }
|
|
|
| HostResolverImpl::~HostResolverImpl() {
|
| - DiscardIPv6ProbeJob();
|
| -
|
| // This will also cancel all outstanding requests.
|
| STLDeleteValues(&jobs_);
|
|
|
| @@ -1780,8 +1743,8 @@ int HostResolverImpl::Resolve(const RequestInfo& info,
|
| AF_WASTE_MAX);
|
| }
|
|
|
| - // Create new Job.
|
| - job = new Job(this, key, info.priority(), request_net_log);
|
| + job = new Job(weak_ptr_factory_.GetWeakPtr(), key, info.priority(),
|
| + request_net_log);
|
| job->Schedule();
|
|
|
| // Check for queue overflow.
|
| @@ -1871,9 +1834,8 @@ void HostResolverImpl::CancelRequest(RequestHandle req_handle) {
|
|
|
| void HostResolverImpl::SetDefaultAddressFamily(AddressFamily address_family) {
|
| DCHECK(CalledOnValidThread());
|
| - ipv6_probe_monitoring_ = false;
|
| - DiscardIPv6ProbeJob();
|
| default_address_family_ = address_family;
|
| + ipv6_probe_monitoring_ = false;
|
| }
|
|
|
| AddressFamily HostResolverImpl::GetDefaultAddressFamily() const {
|
| @@ -1884,7 +1846,7 @@ void HostResolverImpl::ProbeIPv6Support() {
|
| DCHECK(CalledOnValidThread());
|
| DCHECK(!ipv6_probe_monitoring_);
|
| ipv6_probe_monitoring_ = true;
|
| - OnIPAddressChanged(); // Give initial setup call.
|
| + OnIPAddressChanged();
|
| }
|
|
|
| HostCache* HostResolverImpl::GetHostCache() {
|
| @@ -2002,25 +1964,18 @@ void HostResolverImpl::RemoveJob(Job* job) {
|
| jobs_.erase(it);
|
| }
|
|
|
| -void HostResolverImpl::DiscardIPv6ProbeJob() {
|
| - if (ipv6_probe_job_.get()) {
|
| - ipv6_probe_job_->Cancel();
|
| - ipv6_probe_job_ = NULL;
|
| - }
|
| -}
|
| -
|
| void HostResolverImpl::IPv6ProbeSetDefaultAddressFamily(
|
| AddressFamily address_family) {
|
| DCHECK(address_family == ADDRESS_FAMILY_UNSPECIFIED ||
|
| address_family == ADDRESS_FAMILY_IPV4);
|
| + if (!ipv6_probe_monitoring_)
|
| + return;
|
| if (default_address_family_ != address_family) {
|
| VLOG(1) << "IPv6Probe forced AddressFamily setting to "
|
| << ((address_family == ADDRESS_FAMILY_UNSPECIFIED) ?
|
| "ADDRESS_FAMILY_UNSPECIFIED" : "ADDRESS_FAMILY_IPV4");
|
| }
|
| default_address_family_ = address_family;
|
| - // Drop reference since the job has called us back.
|
| - DiscardIPv6ProbeJob();
|
| }
|
|
|
| void HostResolverImpl::SetHaveOnlyLoopbackAddresses(bool result) {
|
| @@ -2092,16 +2047,14 @@ void HostResolverImpl::TryServingAllJobsFromHosts() {
|
| }
|
|
|
| void HostResolverImpl::OnIPAddressChanged() {
|
| + // Abandon all ProbeJobs.
|
| + probe_weak_ptr_factory_.InvalidateWeakPtrs();
|
| if (cache_.get())
|
| cache_->clear();
|
| - if (ipv6_probe_monitoring_) {
|
| - DiscardIPv6ProbeJob();
|
| - ipv6_probe_job_ = new IPv6ProbeJob(this, net_log_);
|
| - ipv6_probe_job_->Start();
|
| - }
|
| + if (ipv6_probe_monitoring_)
|
| + new IPv6ProbeJob(probe_weak_ptr_factory_.GetWeakPtr(), net_log_);
|
| #if defined(OS_POSIX) && !defined(OS_MACOSX)
|
| - // TODO(szym): Use HaveOnlyLoopbackProbeJob. http://crbug.com/157933
|
| - SetHaveOnlyLoopbackAddresses(HaveOnlyLoopbackAddresses());
|
| + new LoopbackProbeJob(probe_weak_ptr_factory_.GetWeakPtr());
|
| #endif
|
| AbortAllInProgressJobs();
|
| // |this| may be deleted inside AbortAllInProgressJobs().
|
|
|