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

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

Issue 9572018: [net] Ensure aborted HostResolverImpl::Jobs release slots in the dispatcher. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Reorder: dispatch then Abort. Created 8 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | 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) 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 1554 matching lines...) Expand 10 before | Expand all | Expand 10 after
1565 Job* job = req->job(); 1565 Job* job = req->job();
1566 DCHECK(job); 1566 DCHECK(job);
1567 1567
1568 job->CancelRequest(req); 1568 job->CancelRequest(req);
1569 1569
1570 if (job->num_active_requests() == 0) { 1570 if (job->num_active_requests() == 0) {
1571 // If we were called from a Requests' callback within Job::CompleteRequests, 1571 // If we were called from a Requests' callback within Job::CompleteRequests,
1572 // that Request could not have been cancelled, so job->num_active_requests() 1572 // that Request could not have been cancelled, so job->num_active_requests()
1573 // could not be 0. Therefore, we are not in Job::CompleteRequests(). 1573 // could not be 0. Therefore, we are not in Job::CompleteRequests().
1574 RemoveJob(job); 1574 RemoveJob(job);
1575 if (job->is_running()) 1575 if (job->is_running()) {
cbentzel 2012/03/02 19:46:49 I asked over email - but is there a chance that a
1576 dispatcher_.OnJobFinished();
1576 job->Abort(); 1577 job->Abort();
cbentzel 2012/03/02 20:02:40 FYI: I don't think the Abort is needed here. ~Job
szym 2012/03/02 20:05:43 The cleaning up is now in a few places: Job::~Job,
1578 }
1577 delete job; 1579 delete job;
1578 } 1580 }
1579 } 1581 }
1580 1582
1581 void HostResolverImpl::SetDefaultAddressFamily(AddressFamily address_family) { 1583 void HostResolverImpl::SetDefaultAddressFamily(AddressFamily address_family) {
1582 DCHECK(CalledOnValidThread()); 1584 DCHECK(CalledOnValidThread());
1583 ipv6_probe_monitoring_ = false; 1585 ipv6_probe_monitoring_ = false;
1584 DiscardIPv6ProbeJob(); 1586 DiscardIPv6ProbeJob();
1585 default_address_family_ = address_family; 1587 default_address_family_ = address_family;
1586 } 1588 }
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1702 if (effective_address_family == ADDRESS_FAMILY_UNSPECIFIED && 1704 if (effective_address_family == ADDRESS_FAMILY_UNSPECIFIED &&
1703 default_address_family_ != ADDRESS_FAMILY_UNSPECIFIED) { 1705 default_address_family_ != ADDRESS_FAMILY_UNSPECIFIED) {
1704 effective_address_family = default_address_family_; 1706 effective_address_family = default_address_family_;
1705 if (ipv6_probe_monitoring_) 1707 if (ipv6_probe_monitoring_)
1706 effective_flags |= HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; 1708 effective_flags |= HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6;
1707 } 1709 }
1708 return Key(info.hostname(), effective_address_family, effective_flags); 1710 return Key(info.hostname(), effective_address_family, effective_flags);
1709 } 1711 }
1710 1712
1711 void HostResolverImpl::AbortAllInProgressJobs() { 1713 void HostResolverImpl::AbortAllInProgressJobs() {
1712 base::WeakPtr<HostResolverImpl> self = AsWeakPtr();
1713 // In Abort, a Request callback could spawn new Jobs with matching keys, so 1714 // In Abort, a Request callback could spawn new Jobs with matching keys, so
1714 // first collect and remove all running jobs from |jobs_|. 1715 // first collect and remove all running jobs from |jobs_|.
1715 std::vector<Job*> jobs_to_abort; 1716 std::vector<Job*> jobs_to_abort;
1716 for (JobMap::iterator it = jobs_.begin(); it != jobs_.end(); ) { 1717 for (JobMap::iterator it = jobs_.begin(); it != jobs_.end(); ) {
1717 Job* job = it->second; 1718 Job* job = it->second;
1718 if (job->is_running()) { 1719 if (job->is_running()) {
1719 jobs_to_abort.push_back(job); 1720 jobs_to_abort.push_back(job);
1720 jobs_.erase(it++); 1721 jobs_.erase(it++);
1721 } else { 1722 } else {
1722 DCHECK(job->is_queued()); 1723 DCHECK(job->is_queued());
1723 ++it; 1724 ++it;
1724 } 1725 }
1725 } 1726 }
1726 1727
1728 // Check if no dispatcher slots leaked out.
1729 DCHECK_EQ(dispatcher_.num_running_jobs(), jobs_to_abort.size());
1730
1731 // Life check to bail once |this| is deleted.
1732 base::WeakPtr<HostResolverImpl> self = AsWeakPtr();
1733
1727 // Then Abort them and dispatch new Jobs. 1734 // Then Abort them and dispatch new Jobs.
1728 for (size_t i = 0; i < jobs_to_abort.size(); ++i) { 1735 for (size_t i = 0; self && i < jobs_to_abort.size(); ++i) {
1736 dispatcher_.OnJobFinished();
1729 jobs_to_abort[i]->Abort(); 1737 jobs_to_abort[i]->Abort();
1730 dispatcher_.OnJobFinished();
1731 } 1738 }
1732 STLDeleteElements(&jobs_to_abort); 1739 STLDeleteElements(&jobs_to_abort);
1733 } 1740 }
1734 1741
1735 void HostResolverImpl::OnIPAddressChanged() { 1742 void HostResolverImpl::OnIPAddressChanged() {
1736 if (cache_.get()) 1743 if (cache_.get())
1737 cache_->clear(); 1744 cache_->clear();
1738 if (ipv6_probe_monitoring_) { 1745 if (ipv6_probe_monitoring_) {
1739 DiscardIPv6ProbeJob(); 1746 DiscardIPv6ProbeJob();
1740 ipv6_probe_job_ = new IPv6ProbeJob(this); 1747 ipv6_probe_job_ = new IPv6ProbeJob(this);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1777 } else { 1784 } else {
1778 dns_transaction_factory_.reset(); 1785 dns_transaction_factory_.reset();
1779 } 1786 }
1780 // Don't Abort running Jobs unless they were running on DnsTransaction. 1787 // Don't Abort running Jobs unless they were running on DnsTransaction.
1781 // TODO(szym): This will change once http://crbug.com/114827 is fixed. 1788 // TODO(szym): This will change once http://crbug.com/114827 is fixed.
1782 if (had_factory) 1789 if (had_factory)
1783 OnDNSChanged(NetworkChangeNotifier::CHANGE_DNS_SETTINGS); 1790 OnDNSChanged(NetworkChangeNotifier::CHANGE_DNS_SETTINGS);
1784 } 1791 }
1785 1792
1786 } // namespace net 1793 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | net/base/host_resolver_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698