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

Side by Side Diff: net/base/host_resolver_impl.cc

Issue 1604045: Fix crash on IP address change. (Closed)
Patch Set: Merge conflict Created 10 years, 8 months 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
« no previous file with comments | « net/base/host_resolver_impl.h ('k') | net/base/host_resolver_impl_unittest.cc » ('j') | 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 #include "net/base/net_log.h" 6 #include "net/base/net_log.h"
7 7
8 #include <cmath> 8 #include <cmath>
9 #include <deque> 9 #include <deque>
10 10
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 ipv6_probe_monitoring_(false) { 676 ipv6_probe_monitoring_(false) {
677 DCHECK_GT(max_jobs, 0u); 677 DCHECK_GT(max_jobs, 0u);
678 678
679 // It is cumbersome to expose all of the constraints in the constructor, 679 // It is cumbersome to expose all of the constraints in the constructor,
680 // so we choose some defaults, which users can override later. 680 // so we choose some defaults, which users can override later.
681 job_pools_[POOL_NORMAL] = new JobPool(max_jobs, 100u * max_jobs); 681 job_pools_[POOL_NORMAL] = new JobPool(max_jobs, 100u * max_jobs);
682 682
683 #if defined(OS_WIN) 683 #if defined(OS_WIN)
684 EnsureWinsockInit(); 684 EnsureWinsockInit();
685 #endif 685 #endif
686 if (network_change_notifier_)
687 network_change_notifier_->AddObserver(this);
686 } 688 }
687 689
688 HostResolverImpl::~HostResolverImpl() { 690 HostResolverImpl::~HostResolverImpl() {
689 // Cancel the outstanding jobs. Those jobs may contain several attached 691 // Cancel the outstanding jobs. Those jobs may contain several attached
690 // requests, which will also be cancelled. 692 // requests, which will also be cancelled.
691 DiscardIPv6ProbeJob(); 693 DiscardIPv6ProbeJob();
692 694
693 for (JobMap::iterator it = jobs_.begin(); it != jobs_.end(); ++it) 695 for (JobMap::iterator it = jobs_.begin(); it != jobs_.end(); ++it)
694 it->second->Cancel(); 696 it->second->Cancel();
695 697
696 // In case we are being deleted during the processing of a callback. 698 // In case we are being deleted during the processing of a callback.
697 if (cur_completing_job_) 699 if (cur_completing_job_)
698 cur_completing_job_->Cancel(); 700 cur_completing_job_->Cancel();
699 701
702 if (network_change_notifier_)
703 network_change_notifier_->RemoveObserver(this);
704
700 // Delete the job pools. 705 // Delete the job pools.
701 for (size_t i = 0u; i < arraysize(job_pools_); ++i) 706 for (size_t i = 0u; i < arraysize(job_pools_); ++i)
702 delete job_pools_[i]; 707 delete job_pools_[i];
703 } 708 }
704 709
705 // TODO(eroman): Don't create cache entries for hostnames which are simply IP 710 // TODO(eroman): Don't create cache entries for hostnames which are simply IP
706 // address literals. 711 // address literals.
707 int HostResolverImpl::Resolve(const RequestInfo& info, 712 int HostResolverImpl::Resolve(const RequestInfo& info,
708 AddressList* addresses, 713 AddressList* addresses,
709 CompletionCallback* callback, 714 CompletionCallback* callback,
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 839
835 void HostResolverImpl::SetDefaultAddressFamily(AddressFamily address_family) { 840 void HostResolverImpl::SetDefaultAddressFamily(AddressFamily address_family) {
836 ipv6_probe_monitoring_ = false; 841 ipv6_probe_monitoring_ = false;
837 DiscardIPv6ProbeJob(); 842 DiscardIPv6ProbeJob();
838 default_address_family_ = address_family; 843 default_address_family_ = address_family;
839 } 844 }
840 845
841 void HostResolverImpl::ProbeIPv6Support() { 846 void HostResolverImpl::ProbeIPv6Support() {
842 DCHECK(!ipv6_probe_monitoring_); 847 DCHECK(!ipv6_probe_monitoring_);
843 ipv6_probe_monitoring_ = true; 848 ipv6_probe_monitoring_ = true;
844 Flush(); // Give initial setup call. 849 OnIPAddressChanged(); // Give initial setup call.
845 } 850 }
846 851
847 void HostResolverImpl::Shutdown() { 852 void HostResolverImpl::Shutdown() {
848 shutdown_ = true; 853 shutdown_ = true;
849 854
850 // Cancel the outstanding jobs. 855 // Cancel the outstanding jobs.
851 for (JobMap::iterator it = jobs_.begin(); it != jobs_.end(); ++it) 856 for (JobMap::iterator it = jobs_.begin(); it != jobs_.end(); ++it)
852 it->second->Cancel(); 857 it->second->Cancel();
853 jobs_.clear(); 858 jobs_.clear();
854 } 859 }
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1067 it != observers_.end(); ++it) { 1072 it != observers_.end(); ++it) {
1068 (*it)->OnCancelResolution(request_id, info); 1073 (*it)->OnCancelResolution(request_id, info);
1069 } 1074 }
1070 1075
1071 net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONCANCEL); 1076 net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONCANCEL);
1072 } 1077 }
1073 1078
1074 net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL); 1079 net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL);
1075 } 1080 }
1076 1081
1077 void HostResolverImpl::Flush() { 1082 void HostResolverImpl::OnIPAddressChanged() {
1078 if (cache_.get()) 1083 if (cache_.get())
1079 cache_->clear(); 1084 cache_->clear();
1080 if (ipv6_probe_monitoring_) { 1085 if (ipv6_probe_monitoring_) {
1081 DiscardIPv6ProbeJob(); 1086 DiscardIPv6ProbeJob();
1082 ipv6_probe_job_ = new IPv6ProbeJob(this); 1087 ipv6_probe_job_ = new IPv6ProbeJob(this);
1083 ipv6_probe_job_->Start(); 1088 ipv6_probe_job_->Start();
1084 } 1089 }
1085 } 1090 }
1086 1091
1087 void HostResolverImpl::DiscardIPv6ProbeJob() { 1092 void HostResolverImpl::DiscardIPv6ProbeJob() {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1185 if (r == req) 1190 if (r == req)
1186 return error; 1191 return error;
1187 1192
1188 r->OnComplete(error, AddressList()); 1193 r->OnComplete(error, AddressList());
1189 } 1194 }
1190 1195
1191 return ERR_IO_PENDING; 1196 return ERR_IO_PENDING;
1192 } 1197 }
1193 1198
1194 } // namespace net 1199 } // namespace net
OLDNEW
« no previous file with comments | « net/base/host_resolver_impl.h ('k') | net/base/host_resolver_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698