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

Side by Side 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: cleanup 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/base/host_resolver_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/base/host_resolver_impl.h" 5 #include "net/base/host_resolver_impl.h"
6 6
7 #if defined(OS_WIN) 7 #if defined(OS_WIN)
8 #include <Winsock2.h> 8 #include <Winsock2.h>
9 #elif defined(OS_POSIX) 9 #elif defined(OS_POSIX)
10 #include <netdb.h> 10 #include <netdb.h>
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 protected: 229 protected:
230 virtual ~CallSystemHostResolverProc() {} 230 virtual ~CallSystemHostResolverProc() {}
231 }; 231 };
232 232
233 AddressList EnsurePortOnAddressList(const AddressList& list, uint16 port) { 233 AddressList EnsurePortOnAddressList(const AddressList& list, uint16 port) {
234 if (list.empty() || list.front().port() == port) 234 if (list.empty() || list.front().port() == port)
235 return list; 235 return list;
236 return AddressList::CopyWithPort(list, port); 236 return AddressList::CopyWithPort(list, port);
237 } 237 }
238 238
239 // Wraps a call to HaveOnlyLoopbackAddresses to be executed on the WorkerPool as
240 // it takes 40-100ms and should not block initialization.
241 class HaveOnlyLoopbackProbeJob
242 : public base::RefCountedThreadSafe<HaveOnlyLoopbackProbeJob> {
243 public:
244 typedef base::Callback<void(bool)> CallbackType;
245 explicit HaveOnlyLoopbackProbeJob(const CallbackType& callback)
246 : result_(false) {
247 const bool kIsSlow = true;
248 base::WorkerPool::PostTaskAndReply(
249 FROM_HERE,
250 base::Bind(&HaveOnlyLoopbackProbeJob::DoProbe, this),
251 base::Bind(&HaveOnlyLoopbackProbeJob::OnProbeComplete, this, callback),
252 kIsSlow);
253 }
254
255 private:
256 friend class base::RefCountedThreadSafe<HaveOnlyLoopbackProbeJob>;
257
258 virtual ~HaveOnlyLoopbackProbeJob() {}
259
260 // Runs on worker thread.
261 void DoProbe() {
262 result_ = HaveOnlyLoopbackAddresses();
263 }
264
265 void OnProbeComplete(const CallbackType& callback) {
266 callback.Run(result_);
267 }
268
269 bool result_;
270
271 DISALLOW_COPY_AND_ASSIGN(HaveOnlyLoopbackProbeJob);
272 };
273
274
275 // Creates NetLog parameters when the resolve failed. 239 // Creates NetLog parameters when the resolve failed.
276 base::Value* NetLogProcTaskFailedCallback(uint32 attempt_number, 240 base::Value* NetLogProcTaskFailedCallback(uint32 attempt_number,
277 int net_error, 241 int net_error,
278 int os_error, 242 int os_error,
279 NetLog::LogLevel /* log_level */) { 243 NetLog::LogLevel /* log_level */) {
280 DictionaryValue* dict = new DictionaryValue(); 244 DictionaryValue* dict = new DictionaryValue();
281 if (attempt_number) 245 if (attempt_number)
282 dict->SetInteger("attempt_number", attempt_number); 246 dict->SetInteger("attempt_number", attempt_number);
283 247
284 dict->SetInteger("net_error", net_error); 248 dict->SetInteger("net_error", net_error);
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after
911 875
912 AddressList results_; 876 AddressList results_;
913 877
914 BoundNetLog net_log_; 878 BoundNetLog net_log_;
915 879
916 DISALLOW_COPY_AND_ASSIGN(ProcTask); 880 DISALLOW_COPY_AND_ASSIGN(ProcTask);
917 }; 881 };
918 882
919 //----------------------------------------------------------------------------- 883 //-----------------------------------------------------------------------------
920 884
921 // Represents a request to the worker pool for a "probe for IPv6 support" call. 885 // Wraps a call to TestIPv6Support to be executed on the WorkerPool as it takes
922 // 886 // 40-100ms.
923 // TODO(szym): This could also be replaced with PostTaskAndReply and Callbacks.
924 class HostResolverImpl::IPv6ProbeJob 887 class HostResolverImpl::IPv6ProbeJob
925 : public base::RefCountedThreadSafe<HostResolverImpl::IPv6ProbeJob> { 888 : public base::RefCountedThreadSafe<HostResolverImpl::IPv6ProbeJob> {
926 public: 889 public:
927 IPv6ProbeJob(HostResolverImpl* resolver, NetLog* net_log) 890 IPv6ProbeJob(const base::WeakPtr<HostResolverImpl>& resolver, NetLog* net_log)
928 : resolver_(resolver), 891 : resolver_(resolver),
929 origin_loop_(base::MessageLoopProxy::current()), 892 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_IPV6_PROBE_JOB)),
930 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_IPV6_PROBE_JOB)) { 893 result_(false, IPV6_SUPPORT_MAX, OK) {
931 DCHECK(resolver); 894 DCHECK(resolver);
932 }
933
934 void Start() {
935 DCHECK(origin_loop_->BelongsToCurrentThread());
936 if (was_canceled())
937 return;
938 net_log_.BeginEvent(NetLog::TYPE_IPV6_PROBE_RUNNING); 895 net_log_.BeginEvent(NetLog::TYPE_IPV6_PROBE_RUNNING);
939 const bool kIsSlow = true; 896 const bool kIsSlow = true;
940 base::WorkerPool::PostTask( 897 base::WorkerPool::PostTaskAndReply(
941 FROM_HERE, base::Bind(&IPv6ProbeJob::DoProbe, this), kIsSlow); 898 FROM_HERE,
942 } 899 base::Bind(&IPv6ProbeJob::DoProbe, this),
943 900 base::Bind(&IPv6ProbeJob::OnProbeComplete, this),
944 // Cancels the current job. 901 kIsSlow);
945 void Cancel() {
946 DCHECK(origin_loop_->BelongsToCurrentThread());
947 if (was_canceled())
948 return;
949 net_log_.AddEvent(NetLog::TYPE_CANCELLED);
950 resolver_ = NULL; // Read/write ONLY on origin thread.
951 } 902 }
952 903
953 private: 904 private:
954 friend class base::RefCountedThreadSafe<HostResolverImpl::IPv6ProbeJob>; 905 friend class base::RefCountedThreadSafe<HostResolverImpl::IPv6ProbeJob>;
955 906
956 ~IPv6ProbeJob() { 907 virtual ~IPv6ProbeJob() {}
908
909 // Runs on worker thread.
910 void DoProbe() {
911 result_ = TestIPv6Support();
957 } 912 }
958 913
959 // Returns true if cancelled or if probe results have already been received 914 void OnProbeComplete() {
960 // on the origin thread. 915 net_log_.EndEvent(NetLog::TYPE_IPV6_PROBE_RUNNING,
961 bool was_canceled() const { 916 base::Bind(&IPv6SupportResult::ToNetLogValue,
962 DCHECK(origin_loop_->BelongsToCurrentThread()); 917 base::Unretained(&result_)));
963 return !resolver_; 918 if (!resolver_)
964 }
965
966 // Run on worker thread.
967 void DoProbe() {
968 // Do actual testing on this thread, as it takes 40-100ms.
969 origin_loop_->PostTask(
970 FROM_HERE,
971 base::Bind(&IPv6ProbeJob::OnProbeComplete, this, TestIPv6Support()));
972 }
973
974 // Callback for when DoProbe() completes.
975 void OnProbeComplete(const IPv6SupportResult& support_result) {
976 DCHECK(origin_loop_->BelongsToCurrentThread());
977 net_log_.EndEvent(
978 NetLog::TYPE_IPV6_PROBE_RUNNING,
979 base::Bind(&IPv6SupportResult::ToNetLogValue,
980 base::Unretained(&support_result)));
981 if (was_canceled())
982 return; 919 return;
983 920 resolver_->IPv6ProbeSetDefaultAddressFamily(
984 // Clear |resolver_| so that no cancel event is logged. 921 result_.ipv6_supported ? ADDRESS_FAMILY_UNSPECIFIED
985 HostResolverImpl* resolver = resolver_;
986 resolver_ = NULL;
987
988 resolver->IPv6ProbeSetDefaultAddressFamily(
989 support_result.ipv6_supported ? ADDRESS_FAMILY_UNSPECIFIED
990 : ADDRESS_FAMILY_IPV4); 922 : ADDRESS_FAMILY_IPV4);
991 } 923 }
992 924
993 // Used/set only on origin thread. 925 // Used/set only on origin thread.
994 HostResolverImpl* resolver_; 926 base::WeakPtr<HostResolverImpl> resolver_;
995
996 // Used to post ourselves onto the origin thread.
997 scoped_refptr<base::MessageLoopProxy> origin_loop_;
998 927
999 BoundNetLog net_log_; 928 BoundNetLog net_log_;
1000 929
930 IPv6SupportResult result_;
931
1001 DISALLOW_COPY_AND_ASSIGN(IPv6ProbeJob); 932 DISALLOW_COPY_AND_ASSIGN(IPv6ProbeJob);
1002 }; 933 };
1003 934
935 // Wraps a call to HaveOnlyLoopbackAddresses to be executed on the WorkerPool as
936 // it takes 40-100ms and should not block initialization.
937 class HostResolverImpl::LoopbackProbeJob
938 : public base::RefCountedThreadSafe<HostResolverImpl::LoopbackProbeJob> {
eroman 2012/11/03 00:56:55 you may consider not making this refcounted anymor
szym 2012/11/05 23:08:04 I forgot about this option. Thanks!
939 public:
940 explicit LoopbackProbeJob(const base::WeakPtr<HostResolverImpl>& resolver)
941 : resolver_(resolver),
942 result_(false) {
943 DCHECK(resolver);
944 const bool kIsSlow = true;
945 base::WorkerPool::PostTaskAndReply(
946 FROM_HERE,
947 base::Bind(&LoopbackProbeJob::DoProbe, this),
948 base::Bind(&LoopbackProbeJob::OnProbeComplete, this),
949 kIsSlow);
950 }
951
952 private:
953 friend class base::RefCountedThreadSafe<HostResolverImpl::LoopbackProbeJob>;
954
955 virtual ~LoopbackProbeJob() {}
956
957 // Runs on worker thread.
958 void DoProbe() {
959 result_ = HaveOnlyLoopbackAddresses();
960 }
961
962 void OnProbeComplete() {
963 if (!resolver_)
964 return;
965 resolver_->SetHaveOnlyLoopbackAddresses(result_);
966 }
967
968 // Used/set only on origin thread.
969 base::WeakPtr<HostResolverImpl> resolver_;
970
971 bool result_;
972
973 DISALLOW_COPY_AND_ASSIGN(LoopbackProbeJob);
974 };
975
1004 //----------------------------------------------------------------------------- 976 //-----------------------------------------------------------------------------
1005 977
1006 // Resolves the hostname using DnsTransaction. 978 // Resolves the hostname using DnsTransaction.
1007 // TODO(szym): This could be moved to separate source file as well. 979 // TODO(szym): This could be moved to separate source file as well.
1008 class HostResolverImpl::DnsTask : public base::SupportsWeakPtr<DnsTask> { 980 class HostResolverImpl::DnsTask : public base::SupportsWeakPtr<DnsTask> {
1009 public: 981 public:
1010 typedef base::Callback<void(int net_error, 982 typedef base::Callback<void(int net_error,
1011 const AddressList& addr_list, 983 const AddressList& addr_list,
1012 base::TimeDelta ttl)> Callback; 984 base::TimeDelta ttl)> Callback;
1013 985
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1174 DISALLOW_COPY_AND_ASSIGN(DnsTask); 1146 DISALLOW_COPY_AND_ASSIGN(DnsTask);
1175 }; 1147 };
1176 1148
1177 //----------------------------------------------------------------------------- 1149 //-----------------------------------------------------------------------------
1178 1150
1179 // Aggregates all Requests for the same Key. Dispatched via PriorityDispatch. 1151 // Aggregates all Requests for the same Key. Dispatched via PriorityDispatch.
1180 class HostResolverImpl::Job : public PrioritizedDispatcher::Job { 1152 class HostResolverImpl::Job : public PrioritizedDispatcher::Job {
1181 public: 1153 public:
1182 // Creates new job for |key| where |request_net_log| is bound to the 1154 // Creates new job for |key| where |request_net_log| is bound to the
1183 // request that spawned it. 1155 // request that spawned it.
1184 Job(HostResolverImpl* resolver, 1156 Job(const base::WeakPtr<HostResolverImpl>& resolver,
1185 const Key& key, 1157 const Key& key,
1186 RequestPriority priority, 1158 RequestPriority priority,
1187 const BoundNetLog& request_net_log) 1159 const BoundNetLog& request_net_log)
1188 : resolver_(resolver->weak_ptr_factory_.GetWeakPtr()), 1160 : resolver_(resolver),
1189 key_(key), 1161 key_(key),
1190 priority_tracker_(priority), 1162 priority_tracker_(priority),
1191 had_non_speculative_request_(false), 1163 had_non_speculative_request_(false),
1192 had_dns_config_(false), 1164 had_dns_config_(false),
1193 dns_task_error_(OK), 1165 dns_task_error_(OK),
1194 creation_time_(base::TimeTicks::Now()), 1166 creation_time_(base::TimeTicks::Now()),
1195 priority_change_time_(creation_time_), 1167 priority_change_time_(creation_time_),
1196 net_log_(BoundNetLog::Make(request_net_log.net_log(), 1168 net_log_(BoundNetLog::Make(request_net_log.net_log(),
1197 NetLog::SOURCE_HOST_RESOLVER_IMPL_JOB)) { 1169 NetLog::SOURCE_HOST_RESOLVER_IMPL_JOB)) {
1198 request_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CREATE_JOB); 1170 request_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CREATE_JOB);
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after
1654 const PrioritizedDispatcher::Limits& job_limits, 1626 const PrioritizedDispatcher::Limits& job_limits,
1655 const ProcTaskParams& proc_params, 1627 const ProcTaskParams& proc_params,
1656 scoped_ptr<DnsClient> dns_client, 1628 scoped_ptr<DnsClient> dns_client,
1657 NetLog* net_log) 1629 NetLog* net_log)
1658 : cache_(cache.Pass()), 1630 : cache_(cache.Pass()),
1659 dispatcher_(job_limits), 1631 dispatcher_(job_limits),
1660 max_queued_jobs_(job_limits.total_jobs * 100u), 1632 max_queued_jobs_(job_limits.total_jobs * 100u),
1661 proc_params_(proc_params), 1633 proc_params_(proc_params),
1662 default_address_family_(ADDRESS_FAMILY_UNSPECIFIED), 1634 default_address_family_(ADDRESS_FAMILY_UNSPECIFIED),
1663 weak_ptr_factory_(this), 1635 weak_ptr_factory_(this),
1636 probe_weak_ptr_factory_(this),
1664 dns_client_(dns_client.Pass()), 1637 dns_client_(dns_client.Pass()),
1665 received_dns_config_(false), 1638 received_dns_config_(false),
1666 ipv6_probe_monitoring_(false), 1639 ipv6_probe_monitoring_(false),
1667 additional_resolver_flags_(0), 1640 additional_resolver_flags_(0),
1668 net_log_(net_log) { 1641 net_log_(net_log) {
1669 1642
1670 DCHECK_GE(dispatcher_.num_priorities(), static_cast<size_t>(NUM_PRIORITIES)); 1643 DCHECK_GE(dispatcher_.num_priorities(), static_cast<size_t>(NUM_PRIORITIES));
1671 1644
1672 // Maximum of 4 retry attempts for host resolution. 1645 // Maximum of 4 retry attempts for host resolution.
1673 static const size_t kDefaultMaxRetryAttempts = 4u; 1646 static const size_t kDefaultMaxRetryAttempts = 4u;
1674 1647
1675 if (proc_params_.max_retry_attempts == HostResolver::kDefaultRetryAttempts) 1648 if (proc_params_.max_retry_attempts == HostResolver::kDefaultRetryAttempts)
1676 proc_params_.max_retry_attempts = kDefaultMaxRetryAttempts; 1649 proc_params_.max_retry_attempts = kDefaultMaxRetryAttempts;
1677 1650
1678 #if defined(OS_WIN) 1651 #if defined(OS_WIN)
1679 EnsureWinsockInit(); 1652 EnsureWinsockInit();
1680 #endif 1653 #endif
1681 #if defined(OS_POSIX) && !defined(OS_MACOSX) 1654 #if defined(OS_POSIX) && !defined(OS_MACOSX)
1682 new HaveOnlyLoopbackProbeJob( 1655 new LoopbackProbeJob(weak_ptr_factory_.GetWeakPtr());
1683 base::Bind(&HostResolverImpl::SetHaveOnlyLoopbackAddresses,
1684 weak_ptr_factory_.GetWeakPtr()));
1685 #endif 1656 #endif
1686 NetworkChangeNotifier::AddIPAddressObserver(this); 1657 NetworkChangeNotifier::AddIPAddressObserver(this);
1687 NetworkChangeNotifier::AddDNSObserver(this); 1658 NetworkChangeNotifier::AddDNSObserver(this);
1688 if (!HaveDnsConfig()) 1659 if (!HaveDnsConfig())
1689 OnDNSChanged(); 1660 OnDNSChanged();
1690 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) && \ 1661 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) && \
1691 !defined(OS_ANDROID) 1662 !defined(OS_ANDROID)
1692 EnsureDnsReloaderInit(); 1663 EnsureDnsReloaderInit();
1693 #endif 1664 #endif
1694 } 1665 }
1695 1666
1696 HostResolverImpl::~HostResolverImpl() { 1667 HostResolverImpl::~HostResolverImpl() {
1697 DiscardIPv6ProbeJob();
1698
1699 // This will also cancel all outstanding requests. 1668 // This will also cancel all outstanding requests.
1700 STLDeleteValues(&jobs_); 1669 STLDeleteValues(&jobs_);
1701 1670
1702 NetworkChangeNotifier::RemoveIPAddressObserver(this); 1671 NetworkChangeNotifier::RemoveIPAddressObserver(this);
1703 NetworkChangeNotifier::RemoveDNSObserver(this); 1672 NetworkChangeNotifier::RemoveDNSObserver(this);
1704 } 1673 }
1705 1674
1706 void HostResolverImpl::SetMaxQueuedJobs(size_t value) { 1675 void HostResolverImpl::SetMaxQueuedJobs(size_t value) {
1707 DCHECK_EQ(0u, dispatcher_.num_queued_jobs()); 1676 DCHECK_EQ(0u, dispatcher_.num_queued_jobs());
1708 DCHECK_GT(value, 0u); 1677 DCHECK_GT(value, 0u);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1773 category = ipv4 ? AF_WASTE_CACHE_IPV4 : AF_WASTE_CACHE_UNSPEC; 1742 category = ipv4 ? AF_WASTE_CACHE_IPV4 : AF_WASTE_CACHE_UNSPEC;
1774 } else if (found_other_family_job) { 1743 } else if (found_other_family_job) {
1775 category = ipv4 ? AF_WASTE_JOB_IPV4 : AF_WASTE_JOB_UNSPEC; 1744 category = ipv4 ? AF_WASTE_JOB_IPV4 : AF_WASTE_JOB_UNSPEC;
1776 } else { 1745 } else {
1777 category = ipv4 ? AF_WASTE_NONE_IPV4 : AF_WASTE_NONE_UNSPEC; 1746 category = ipv4 ? AF_WASTE_NONE_IPV4 : AF_WASTE_NONE_UNSPEC;
1778 } 1747 }
1779 UMA_HISTOGRAM_ENUMERATION("DNS.ResolveUnspecWaste", category, 1748 UMA_HISTOGRAM_ENUMERATION("DNS.ResolveUnspecWaste", category,
1780 AF_WASTE_MAX); 1749 AF_WASTE_MAX);
1781 } 1750 }
1782 1751
1783 // Create new Job. 1752 job = new Job(weak_ptr_factory_.GetWeakPtr(), key, info.priority(),
1784 job = new Job(this, key, info.priority(), request_net_log); 1753 request_net_log);
1785 job->Schedule(); 1754 job->Schedule();
1786 1755
1787 // Check for queue overflow. 1756 // Check for queue overflow.
1788 if (dispatcher_.num_queued_jobs() > max_queued_jobs_) { 1757 if (dispatcher_.num_queued_jobs() > max_queued_jobs_) {
1789 Job* evicted = static_cast<Job*>(dispatcher_.EvictOldestLowest()); 1758 Job* evicted = static_cast<Job*>(dispatcher_.EvictOldestLowest());
1790 DCHECK(evicted); 1759 DCHECK(evicted);
1791 evicted->OnEvicted(); // Deletes |evicted|. 1760 evicted->OnEvicted(); // Deletes |evicted|.
1792 if (evicted == job) { 1761 if (evicted == job) {
1793 rv = ERR_HOST_RESOLVER_QUEUE_TOO_LARGE; 1762 rv = ERR_HOST_RESOLVER_QUEUE_TOO_LARGE;
1794 LogFinishRequest(source_net_log, request_net_log, info, rv); 1763 LogFinishRequest(source_net_log, request_net_log, info, rv);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1864 DCHECK(CalledOnValidThread()); 1833 DCHECK(CalledOnValidThread());
1865 Request* req = reinterpret_cast<Request*>(req_handle); 1834 Request* req = reinterpret_cast<Request*>(req_handle);
1866 DCHECK(req); 1835 DCHECK(req);
1867 Job* job = req->job(); 1836 Job* job = req->job();
1868 DCHECK(job); 1837 DCHECK(job);
1869 job->CancelRequest(req); 1838 job->CancelRequest(req);
1870 } 1839 }
1871 1840
1872 void HostResolverImpl::SetDefaultAddressFamily(AddressFamily address_family) { 1841 void HostResolverImpl::SetDefaultAddressFamily(AddressFamily address_family) {
1873 DCHECK(CalledOnValidThread()); 1842 DCHECK(CalledOnValidThread());
1843 default_address_family_ = address_family;
1874 ipv6_probe_monitoring_ = false; 1844 ipv6_probe_monitoring_ = false;
1875 DiscardIPv6ProbeJob(); 1845 OnIPAddressChanged();
eroman 2012/11/03 00:56:55 This has the sideffect of cancelling all current r
szym 2012/11/05 23:08:04 I've realized that when |ipv6_probe_monitoring_ ==
1876 default_address_family_ = address_family;
1877 } 1846 }
1878 1847
1879 AddressFamily HostResolverImpl::GetDefaultAddressFamily() const { 1848 AddressFamily HostResolverImpl::GetDefaultAddressFamily() const {
1880 return default_address_family_; 1849 return default_address_family_;
1881 } 1850 }
1882 1851
1883 void HostResolverImpl::ProbeIPv6Support() { 1852 void HostResolverImpl::ProbeIPv6Support() {
1884 DCHECK(CalledOnValidThread()); 1853 DCHECK(CalledOnValidThread());
1885 DCHECK(!ipv6_probe_monitoring_); 1854 DCHECK(!ipv6_probe_monitoring_);
1886 ipv6_probe_monitoring_ = true; 1855 ipv6_probe_monitoring_ = true;
1887 OnIPAddressChanged(); // Give initial setup call. 1856 OnIPAddressChanged();
1888 } 1857 }
1889 1858
1890 HostCache* HostResolverImpl::GetHostCache() { 1859 HostCache* HostResolverImpl::GetHostCache() {
1891 return cache_.get(); 1860 return cache_.get();
1892 } 1861 }
1893 1862
1894 base::Value* HostResolverImpl::GetDnsConfigAsValue() const { 1863 base::Value* HostResolverImpl::GetDnsConfigAsValue() const {
1895 // Check if async DNS is disabled. 1864 // Check if async DNS is disabled.
1896 if (!dns_client_.get()) 1865 if (!dns_client_.get())
1897 return NULL; 1866 return NULL;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1995 cache_->Set(key, entry, base::TimeTicks::Now(), ttl); 1964 cache_->Set(key, entry, base::TimeTicks::Now(), ttl);
1996 } 1965 }
1997 1966
1998 void HostResolverImpl::RemoveJob(Job* job) { 1967 void HostResolverImpl::RemoveJob(Job* job) {
1999 DCHECK(job); 1968 DCHECK(job);
2000 JobMap::iterator it = jobs_.find(job->key()); 1969 JobMap::iterator it = jobs_.find(job->key());
2001 if (it != jobs_.end() && it->second == job) 1970 if (it != jobs_.end() && it->second == job)
2002 jobs_.erase(it); 1971 jobs_.erase(it);
2003 } 1972 }
2004 1973
2005 void HostResolverImpl::DiscardIPv6ProbeJob() {
2006 if (ipv6_probe_job_.get()) {
2007 ipv6_probe_job_->Cancel();
2008 ipv6_probe_job_ = NULL;
2009 }
2010 }
2011
2012 void HostResolverImpl::IPv6ProbeSetDefaultAddressFamily( 1974 void HostResolverImpl::IPv6ProbeSetDefaultAddressFamily(
2013 AddressFamily address_family) { 1975 AddressFamily address_family) {
2014 DCHECK(address_family == ADDRESS_FAMILY_UNSPECIFIED || 1976 DCHECK(address_family == ADDRESS_FAMILY_UNSPECIFIED ||
2015 address_family == ADDRESS_FAMILY_IPV4); 1977 address_family == ADDRESS_FAMILY_IPV4);
2016 if (default_address_family_ != address_family) { 1978 if (default_address_family_ != address_family) {
2017 VLOG(1) << "IPv6Probe forced AddressFamily setting to " 1979 VLOG(1) << "IPv6Probe forced AddressFamily setting to "
2018 << ((address_family == ADDRESS_FAMILY_UNSPECIFIED) ? 1980 << ((address_family == ADDRESS_FAMILY_UNSPECIFIED) ?
2019 "ADDRESS_FAMILY_UNSPECIFIED" : "ADDRESS_FAMILY_IPV4"); 1981 "ADDRESS_FAMILY_UNSPECIFIED" : "ADDRESS_FAMILY_IPV4");
2020 } 1982 }
2021 default_address_family_ = address_family; 1983 default_address_family_ = address_family;
2022 // Drop reference since the job has called us back.
2023 DiscardIPv6ProbeJob();
2024 } 1984 }
2025 1985
2026 void HostResolverImpl::SetHaveOnlyLoopbackAddresses(bool result) { 1986 void HostResolverImpl::SetHaveOnlyLoopbackAddresses(bool result) {
2027 if (result) { 1987 if (result) {
2028 additional_resolver_flags_ |= HOST_RESOLVER_LOOPBACK_ONLY; 1988 additional_resolver_flags_ |= HOST_RESOLVER_LOOPBACK_ONLY;
2029 } else { 1989 } else {
2030 additional_resolver_flags_ &= ~HOST_RESOLVER_LOOPBACK_ONLY; 1990 additional_resolver_flags_ &= ~HOST_RESOLVER_LOOPBACK_ONLY;
2031 } 1991 }
2032 } 1992 }
2033 1993
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2085 2045
2086 for (JobMap::iterator it = jobs_.begin(); self && it != jobs_.end(); ) { 2046 for (JobMap::iterator it = jobs_.begin(); self && it != jobs_.end(); ) {
2087 Job* job = it->second; 2047 Job* job = it->second;
2088 ++it; 2048 ++it;
2089 // This could remove |job| from |jobs_|, but iterator will remain valid. 2049 // This could remove |job| from |jobs_|, but iterator will remain valid.
2090 job->ServeFromHosts(); 2050 job->ServeFromHosts();
2091 } 2051 }
2092 } 2052 }
2093 2053
2094 void HostResolverImpl::OnIPAddressChanged() { 2054 void HostResolverImpl::OnIPAddressChanged() {
2055 // Abandon all ProbeJobs.
2056 probe_weak_ptr_factory_.InvalidateWeakPtrs();
2095 if (cache_.get()) 2057 if (cache_.get())
2096 cache_->clear(); 2058 cache_->clear();
2097 if (ipv6_probe_monitoring_) { 2059 if (ipv6_probe_monitoring_)
2098 DiscardIPv6ProbeJob(); 2060 new IPv6ProbeJob(probe_weak_ptr_factory_.GetWeakPtr(), net_log_);
2099 ipv6_probe_job_ = new IPv6ProbeJob(this, net_log_);
2100 ipv6_probe_job_->Start();
2101 }
2102 #if defined(OS_POSIX) && !defined(OS_MACOSX) 2061 #if defined(OS_POSIX) && !defined(OS_MACOSX)
2103 // TODO(szym): Use HaveOnlyLoopbackProbeJob. http://crbug.com/157933 2062 new LoopbackProbeJob(probe_weak_ptr_factory_.GetWeakPtr());
2104 SetHaveOnlyLoopbackAddresses(HaveOnlyLoopbackAddresses());
2105 #endif 2063 #endif
2106 AbortAllInProgressJobs(); 2064 AbortAllInProgressJobs();
2107 // |this| may be deleted inside AbortAllInProgressJobs(). 2065 // |this| may be deleted inside AbortAllInProgressJobs().
2108 } 2066 }
2109 2067
2110 void HostResolverImpl::OnDNSChanged() { 2068 void HostResolverImpl::OnDNSChanged() {
2111 DnsConfig dns_config; 2069 DnsConfig dns_config;
2112 NetworkChangeNotifier::GetDnsConfig(&dns_config); 2070 NetworkChangeNotifier::GetDnsConfig(&dns_config);
2113 if (net_log_) { 2071 if (net_log_) {
2114 net_log_->AddGlobalEntry( 2072 net_log_->AddGlobalEntry(
(...skipping 26 matching lines...) Expand all
2141 // |this| may be deleted inside AbortAllInProgressJobs(). 2099 // |this| may be deleted inside AbortAllInProgressJobs().
2142 if (self) 2100 if (self)
2143 TryServingAllJobsFromHosts(); 2101 TryServingAllJobsFromHosts();
2144 } 2102 }
2145 2103
2146 bool HostResolverImpl::HaveDnsConfig() const { 2104 bool HostResolverImpl::HaveDnsConfig() const {
2147 return (dns_client_.get() != NULL) && (dns_client_->GetConfig() != NULL); 2105 return (dns_client_.get() != NULL) && (dns_client_->GetConfig() != NULL);
2148 } 2106 }
2149 2107
2150 } // namespace net 2108 } // namespace net
OLDNEW
« 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