Index: net/dns/mojo_host_resolver_impl.cc |
diff --git a/net/dns/mojo_host_resolver_impl.cc b/net/dns/mojo_host_resolver_impl.cc |
index f8f08d8b249da078cd7fc61fe3f73d665e67f24f..e61387ab7404e32e5ab2048adc4b573c848a4efd 100644 |
--- a/net/dns/mojo_host_resolver_impl.cc |
+++ b/net/dns/mojo_host_resolver_impl.cc |
@@ -6,7 +6,6 @@ |
#include <utility> |
-#include "base/stl_util.h" |
#include "net/base/address_list.h" |
#include "net/base/net_errors.h" |
#include "net/base/network_interfaces.h" |
@@ -26,6 +25,8 @@ class MojoHostResolverImpl::Job { |
interfaces::HostResolverRequestClientPtr client); |
~Job(); |
+ void set_iter(std::list<Job>::iterator iter) { iter_ = iter; } |
+ |
void Start(); |
private: |
@@ -36,6 +37,9 @@ class MojoHostResolverImpl::Job { |
void OnConnectionError(); |
MojoHostResolverImpl* resolver_service_; |
+ // This Job's iterator in |resolver_service_|, so the Job may be removed on |
+ // completion. |
+ std::list<Job>::iterator iter_; |
net::HostResolver* resolver_; |
net::HostResolver::RequestInfo request_info_; |
const NetLogWithSource net_log_; |
@@ -51,7 +55,6 @@ MojoHostResolverImpl::MojoHostResolverImpl(net::HostResolver* resolver, |
MojoHostResolverImpl::~MojoHostResolverImpl() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- base::STLDeleteElements(&pending_jobs_); |
} |
void MojoHostResolverImpl::Resolve( |
@@ -64,17 +67,17 @@ void MojoHostResolverImpl::Resolve( |
// IP address. |
request_info->set_host_port_pair(HostPortPair(GetHostName(), 80)); |
} |
- Job* job = |
- new Job(this, resolver_, *request_info, net_log_, std::move(client)); |
- pending_jobs_.insert(job); |
+ |
+ pending_jobs_.emplace_front(this, resolver_, *request_info, net_log_, |
+ std::move(client)); |
+ auto job = pending_jobs_.begin(); |
+ job->set_iter(job); |
job->Start(); |
} |
-void MojoHostResolverImpl::DeleteJob(Job* job) { |
+void MojoHostResolverImpl::DeleteJob(std::list<Job>::iterator job) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- size_t num_erased = pending_jobs_.erase(job); |
- DCHECK(num_erased); |
- delete job; |
+ pending_jobs_.erase(job); |
} |
MojoHostResolverImpl::Job::Job( |
@@ -93,6 +96,9 @@ MojoHostResolverImpl::Job::Job( |
} |
void MojoHostResolverImpl::Job::Start() { |
+ // The caller is responsible for setting up |iter_|. |
+ DCHECK_EQ(this, &*iter_); |
+ |
DVLOG(1) << "Resolve " << request_info_.host_port_pair().ToString(); |
int result = |
resolver_->Resolve(request_info_, DEFAULT_PRIORITY, &result_, |
@@ -117,7 +123,7 @@ void MojoHostResolverImpl::Job::OnResolveDone(int result) { |
DVLOG(1) << address.ToString(); |
} |
client_->ReportResult(result, result_); |
- resolver_service_->DeleteJob(this); |
+ resolver_service_->DeleteJob(iter_); |
} |
void MojoHostResolverImpl::Job::OnConnectionError() { |
@@ -126,7 +132,7 @@ void MojoHostResolverImpl::Job::OnConnectionError() { |
DCHECK(resolver_service_); |
DVLOG(1) << "Connection error on request for " |
<< request_info_.host_port_pair().ToString(); |
- resolver_service_->DeleteJob(this); |
+ resolver_service_->DeleteJob(iter_); |
} |
} // namespace net |