diff options
author | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-01 14:42:03 +0000 |
---|---|---|
committer | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-01 14:42:03 +0000 |
commit | ef4c40cd2c5051e08d42f949c1ff8eefed646057 (patch) | |
tree | fd488a81b5c8133d23730d4116afb02f71b56caf /net/base/host_resolver_impl.cc | |
parent | 19ac2b9eacf6c2dfa63dee8a61b7d09b7e43717f (diff) | |
download | chromium_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.cc | 40 |
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 |