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

Unified Diff: net/base/host_resolver_impl.cc

Issue 11359007: [net] Make HostResolverImpl::OnIPAddressChange faster by removing blocking on HaveOnlyLoopbackAddre… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: use ipv6_probe_monitoring_ as a cancellation flag Created 8 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/base/host_resolver_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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().
« no previous file with comments | « net/base/host_resolver_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698