summaryrefslogtreecommitdiffstats
path: root/net/base/host_resolver_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/base/host_resolver_impl.cc')
-rw-r--r--net/base/host_resolver_impl.cc33
1 files changed, 24 insertions, 9 deletions
diff --git a/net/base/host_resolver_impl.cc b/net/base/host_resolver_impl.cc
index b8858ab..9ec0a37 100644
--- a/net/base/host_resolver_impl.cc
+++ b/net/base/host_resolver_impl.cc
@@ -961,9 +961,10 @@ class HostResolverImpl::ProcTask
class HostResolverImpl::IPv6ProbeJob
: public base::RefCountedThreadSafe<HostResolverImpl::IPv6ProbeJob> {
public:
- explicit IPv6ProbeJob(HostResolverImpl* resolver)
+ IPv6ProbeJob(HostResolverImpl* resolver, NetLog* net_log)
: resolver_(resolver),
- origin_loop_(base::MessageLoopProxy::current()) {
+ origin_loop_(base::MessageLoopProxy::current()),
+ net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_IPV6_PROBE_JOB)) {
DCHECK(resolver);
}
@@ -971,6 +972,7 @@ class HostResolverImpl::IPv6ProbeJob
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);
@@ -981,6 +983,7 @@ class HostResolverImpl::IPv6ProbeJob
DCHECK(origin_loop_->BelongsToCurrentThread());
if (was_canceled())
return;
+ net_log_.AddEvent(NetLog::TYPE_CANCELLED);
resolver_ = NULL; // Read/write ONLY on origin thread.
}
@@ -990,6 +993,8 @@ class HostResolverImpl::IPv6ProbeJob
~IPv6ProbeJob() {
}
+ // 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_;
@@ -998,20 +1003,28 @@ class HostResolverImpl::IPv6ProbeJob
// Run on worker thread.
void DoProbe() {
// Do actual testing on this thread, as it takes 40-100ms.
- AddressFamily family = IPv6Supported() ? ADDRESS_FAMILY_UNSPECIFIED
- : ADDRESS_FAMILY_IPV4;
-
origin_loop_->PostTask(
FROM_HERE,
- base::Bind(&IPv6ProbeJob::OnProbeComplete, this, family));
+ base::Bind(&IPv6ProbeJob::OnProbeComplete, this, TestIPv6Support()));
}
// Callback for when DoProbe() completes.
- void OnProbeComplete(AddressFamily address_family) {
+ 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;
- resolver_->IPv6ProbeSetDefaultAddressFamily(address_family);
+
+ // Clear |resolver_| so that no cancel event is logged.
+ HostResolverImpl* resolver = resolver_;
+ resolver_ = NULL;
+
+ resolver->IPv6ProbeSetDefaultAddressFamily(
+ support_result.ipv6_supported ? ADDRESS_FAMILY_UNSPECIFIED
+ : ADDRESS_FAMILY_IPV4);
}
// Used/set only on origin thread.
@@ -1020,6 +1033,8 @@ class HostResolverImpl::IPv6ProbeJob
// Used to post ourselves onto the origin thread.
scoped_refptr<base::MessageLoopProxy> origin_loop_;
+ BoundNetLog net_log_;
+
DISALLOW_COPY_AND_ASSIGN(IPv6ProbeJob);
};
@@ -1954,7 +1969,7 @@ void HostResolverImpl::OnIPAddressChanged() {
cache_->clear();
if (ipv6_probe_monitoring_) {
DiscardIPv6ProbeJob();
- ipv6_probe_job_ = new IPv6ProbeJob(this);
+ ipv6_probe_job_ = new IPv6ProbeJob(this, net_log_);
ipv6_probe_job_->Start();
}
#if defined(OS_POSIX) && !defined(OS_MACOSX)