summaryrefslogtreecommitdiffstats
path: root/net/base/host_resolver_impl.cc
diff options
context:
space:
mode:
authorwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-01 14:42:03 +0000
committerwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-01 14:42:03 +0000
commitef4c40cd2c5051e08d42f949c1ff8eefed646057 (patch)
treefd488a81b5c8133d23730d4116afb02f71b56caf /net/base/host_resolver_impl.cc
parent19ac2b9eacf6c2dfa63dee8a61b7d09b7e43717f (diff)
downloadchromium_src-ef4c40cd2c5051e08d42f949c1ff8eefed646057.zip
chromium_src-ef4c40cd2c5051e08d42f949c1ff8eefed646057.tar.gz
chromium_src-ef4c40cd2c5051e08d42f949c1ff8eefed646057.tar.bz2
Relands r58007.
Fixes the problem with the flaky unittest that happened due to message loop posting race conditions. BUG=53386 TEST=HostResolverImplTest.AbortOnIPAddressChanged,HostResolverImplTest.OnlyAbortExistingRequestsOnIPAddressChange Review URL: http://codereview.chromium.org/3231013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58171 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/host_resolver_impl.cc')
-rw-r--r--net/base/host_resolver_impl.cc40
1 files changed, 34 insertions, 6 deletions
diff --git a/net/base/host_resolver_impl.cc b/net/base/host_resolver_impl.cc
index f4f7bbd..b93ae31 100644
--- a/net/base/host_resolver_impl.cc
+++ b/net/base/host_resolver_impl.cc
@@ -258,7 +258,9 @@ class HostResolverImpl::Request {
void OnComplete(int error, const AddressList& addrlist) {
if (error == OK)
addresses_->SetFrom(addrlist, port());
- callback_->Run(error);
+ CompletionCallback* callback = callback_;
+ MarkAsCancelled();
+ callback->Run(error);
}
int port() const {
@@ -840,8 +842,7 @@ HostResolverImpl::~HostResolverImpl() {
// requests, which will also be cancelled.
DiscardIPv6ProbeJob();
- for (JobMap::iterator it = jobs_.begin(); it != jobs_.end(); ++it)
- it->second->Cancel();
+ CancelAllJobs();
// In case we are being deleted during the processing of a callback.
if (cur_completing_job_)
@@ -1035,9 +1036,7 @@ void HostResolverImpl::Shutdown() {
DCHECK(CalledOnValidThread());
// Cancel the outstanding jobs.
- for (JobMap::iterator it = jobs_.begin(); it != jobs_.end(); ++it)
- it->second->Cancel();
- jobs_.clear();
+ CancelAllJobs();
DiscardIPv6ProbeJob();
shutdown_ = true;
@@ -1090,6 +1089,18 @@ void HostResolverImpl::OnJobComplete(Job* job,
if (cache_.get())
cache_->Set(job->key(), net_error, addrlist, base::TimeTicks::Now());
+ OnJobCompleteInternal(job, net_error, os_error, addrlist);
+}
+
+void HostResolverImpl::AbortJob(Job* job) {
+ OnJobCompleteInternal(job, ERR_ABORTED, 0 /* no os_error */, AddressList());
+}
+
+void HostResolverImpl::OnJobCompleteInternal(
+ Job* job,
+ int net_error,
+ int os_error,
+ const AddressList& addrlist) {
// Make a note that we are executing within OnJobComplete() in case the
// HostResolver is deleted by a callback invocation.
DCHECK(!cur_completing_job_);
@@ -1199,6 +1210,7 @@ void HostResolverImpl::OnIPAddressChanged() {
ipv6_probe_job_ = new IPv6ProbeJob(this);
ipv6_probe_job_->Start();
}
+ AbortAllJobs();
#if defined(OS_LINUX)
if (HaveOnlyLoopbackAddresses()) {
additional_resolver_flags_ |= HOST_RESOLVER_LOOPBACK_ONLY;
@@ -1317,4 +1329,20 @@ int HostResolverImpl::EnqueueRequest(JobPool* pool, Request* req) {
return ERR_IO_PENDING;
}
+void HostResolverImpl::CancelAllJobs() {
+ JobMap jobs;
+ jobs.swap(jobs_);
+ for (JobMap::iterator it = jobs.begin(); it != jobs.end(); ++it)
+ it->second->Cancel();
+}
+
+void HostResolverImpl::AbortAllJobs() {
+ JobMap jobs;
+ jobs.swap(jobs_);
+ for (JobMap::iterator it = jobs.begin(); it != jobs.end(); ++it) {
+ AbortJob(it->second);
+ it->second->Cancel();
+ }
+}
+
} // namespace net