Chromium Code Reviews| 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); |
|
mmenke
2016/11/11 16:15:25
Worth checking if &*job is in the list? I'm not r
|
| } |
| 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_); |
|
mmenke
2016/11/11 16:15:25
optional: Maybe also do this in Job::OnConnection
|
| + |
| 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 |