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

Side by Side Diff: net/dns/mojo_host_resolver_impl.cc

Issue 2489113002: Remove stl_util's deletion functions from MojoHostResolverImpl. (Closed)
Patch Set: add missing include, rebase Created 4 years 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
« no previous file with comments | « net/dns/mojo_host_resolver_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/dns/mojo_host_resolver_impl.h" 5 #include "net/dns/mojo_host_resolver_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/stl_util.h"
10 #include "net/base/address_list.h" 9 #include "net/base/address_list.h"
11 #include "net/base/net_errors.h" 10 #include "net/base/net_errors.h"
12 #include "net/base/network_interfaces.h" 11 #include "net/base/network_interfaces.h"
13 #include "net/dns/host_resolver.h" 12 #include "net/dns/host_resolver.h"
14 13
15 namespace net { 14 namespace net {
16 15
17 // Handles host resolution for a single request and sends a response when done. 16 // Handles host resolution for a single request and sends a response when done.
18 // Also detects connection errors for HostResolverRequestClient and cancels the 17 // Also detects connection errors for HostResolverRequestClient and cancels the
19 // outstanding resolve request. Owned by MojoHostResolverImpl. 18 // outstanding resolve request. Owned by MojoHostResolverImpl.
20 class MojoHostResolverImpl::Job { 19 class MojoHostResolverImpl::Job {
21 public: 20 public:
22 Job(MojoHostResolverImpl* resolver_service, 21 Job(MojoHostResolverImpl* resolver_service,
23 net::HostResolver* resolver, 22 net::HostResolver* resolver,
24 const net::HostResolver::RequestInfo& request_info, 23 const net::HostResolver::RequestInfo& request_info,
25 const NetLogWithSource& net_log, 24 const NetLogWithSource& net_log,
26 interfaces::HostResolverRequestClientPtr client); 25 interfaces::HostResolverRequestClientPtr client);
27 ~Job(); 26 ~Job();
28 27
28 void set_iter(std::list<Job>::iterator iter) { iter_ = iter; }
29
29 void Start(); 30 void Start();
30 31
31 private: 32 private:
32 // Completion callback for the HostResolver::Resolve request. 33 // Completion callback for the HostResolver::Resolve request.
33 void OnResolveDone(int result); 34 void OnResolveDone(int result);
34 35
35 // Mojo error handler. 36 // Mojo error handler.
36 void OnConnectionError(); 37 void OnConnectionError();
37 38
38 MojoHostResolverImpl* resolver_service_; 39 MojoHostResolverImpl* resolver_service_;
40 // This Job's iterator in |resolver_service_|, so the Job may be removed on
41 // completion.
42 std::list<Job>::iterator iter_;
39 net::HostResolver* resolver_; 43 net::HostResolver* resolver_;
40 net::HostResolver::RequestInfo request_info_; 44 net::HostResolver::RequestInfo request_info_;
41 const NetLogWithSource net_log_; 45 const NetLogWithSource net_log_;
42 interfaces::HostResolverRequestClientPtr client_; 46 interfaces::HostResolverRequestClientPtr client_;
43 std::unique_ptr<net::HostResolver::Request> request_; 47 std::unique_ptr<net::HostResolver::Request> request_;
44 AddressList result_; 48 AddressList result_;
45 base::ThreadChecker thread_checker_; 49 base::ThreadChecker thread_checker_;
46 }; 50 };
47 51
48 MojoHostResolverImpl::MojoHostResolverImpl(net::HostResolver* resolver, 52 MojoHostResolverImpl::MojoHostResolverImpl(net::HostResolver* resolver,
49 const NetLogWithSource& net_log) 53 const NetLogWithSource& net_log)
50 : resolver_(resolver), net_log_(net_log) {} 54 : resolver_(resolver), net_log_(net_log) {}
51 55
52 MojoHostResolverImpl::~MojoHostResolverImpl() { 56 MojoHostResolverImpl::~MojoHostResolverImpl() {
53 DCHECK(thread_checker_.CalledOnValidThread()); 57 DCHECK(thread_checker_.CalledOnValidThread());
54 base::STLDeleteElements(&pending_jobs_);
55 } 58 }
56 59
57 void MojoHostResolverImpl::Resolve( 60 void MojoHostResolverImpl::Resolve(
58 std::unique_ptr<HostResolver::RequestInfo> request_info, 61 std::unique_ptr<HostResolver::RequestInfo> request_info,
59 interfaces::HostResolverRequestClientPtr client) { 62 interfaces::HostResolverRequestClientPtr client) {
60 DCHECK(thread_checker_.CalledOnValidThread()); 63 DCHECK(thread_checker_.CalledOnValidThread());
61 if (request_info->is_my_ip_address()) { 64 if (request_info->is_my_ip_address()) {
62 // The proxy resolver running inside a sandbox may not be able to get the 65 // The proxy resolver running inside a sandbox may not be able to get the
63 // correct host name. Instead, fill it ourself if the request is for our own 66 // correct host name. Instead, fill it ourself if the request is for our own
64 // IP address. 67 // IP address.
65 request_info->set_host_port_pair(HostPortPair(GetHostName(), 80)); 68 request_info->set_host_port_pair(HostPortPair(GetHostName(), 80));
66 } 69 }
67 Job* job = 70
68 new Job(this, resolver_, *request_info, net_log_, std::move(client)); 71 pending_jobs_.emplace_front(this, resolver_, *request_info, net_log_,
69 pending_jobs_.insert(job); 72 std::move(client));
73 auto job = pending_jobs_.begin();
74 job->set_iter(job);
70 job->Start(); 75 job->Start();
71 } 76 }
72 77
73 void MojoHostResolverImpl::DeleteJob(Job* job) { 78 void MojoHostResolverImpl::DeleteJob(std::list<Job>::iterator job) {
74 DCHECK(thread_checker_.CalledOnValidThread()); 79 DCHECK(thread_checker_.CalledOnValidThread());
75 size_t num_erased = pending_jobs_.erase(job); 80 pending_jobs_.erase(job);
76 DCHECK(num_erased);
77 delete job;
78 } 81 }
79 82
80 MojoHostResolverImpl::Job::Job( 83 MojoHostResolverImpl::Job::Job(
81 MojoHostResolverImpl* resolver_service, 84 MojoHostResolverImpl* resolver_service,
82 net::HostResolver* resolver, 85 net::HostResolver* resolver,
83 const net::HostResolver::RequestInfo& request_info, 86 const net::HostResolver::RequestInfo& request_info,
84 const NetLogWithSource& net_log, 87 const NetLogWithSource& net_log,
85 interfaces::HostResolverRequestClientPtr client) 88 interfaces::HostResolverRequestClientPtr client)
86 : resolver_service_(resolver_service), 89 : resolver_service_(resolver_service),
87 resolver_(resolver), 90 resolver_(resolver),
88 request_info_(request_info), 91 request_info_(request_info),
89 net_log_(net_log), 92 net_log_(net_log),
90 client_(std::move(client)) { 93 client_(std::move(client)) {
91 client_.set_connection_error_handler(base::Bind( 94 client_.set_connection_error_handler(base::Bind(
92 &MojoHostResolverImpl::Job::OnConnectionError, base::Unretained(this))); 95 &MojoHostResolverImpl::Job::OnConnectionError, base::Unretained(this)));
93 } 96 }
94 97
95 void MojoHostResolverImpl::Job::Start() { 98 void MojoHostResolverImpl::Job::Start() {
99 // The caller is responsible for setting up |iter_|.
100 DCHECK_EQ(this, &*iter_);
101
96 DVLOG(1) << "Resolve " << request_info_.host_port_pair().ToString(); 102 DVLOG(1) << "Resolve " << request_info_.host_port_pair().ToString();
97 int result = 103 int result =
98 resolver_->Resolve(request_info_, DEFAULT_PRIORITY, &result_, 104 resolver_->Resolve(request_info_, DEFAULT_PRIORITY, &result_,
99 base::Bind(&MojoHostResolverImpl::Job::OnResolveDone, 105 base::Bind(&MojoHostResolverImpl::Job::OnResolveDone,
100 base::Unretained(this)), 106 base::Unretained(this)),
101 &request_, net_log_); 107 &request_, net_log_);
102 108
103 if (result != ERR_IO_PENDING) 109 if (result != ERR_IO_PENDING)
104 OnResolveDone(result); 110 OnResolveDone(result);
105 } 111 }
106 112
107 MojoHostResolverImpl::Job::~Job() { 113 MojoHostResolverImpl::Job::~Job() {
108 } 114 }
109 115
110 void MojoHostResolverImpl::Job::OnResolveDone(int result) { 116 void MojoHostResolverImpl::Job::OnResolveDone(int result) {
111 DCHECK(thread_checker_.CalledOnValidThread()); 117 DCHECK(thread_checker_.CalledOnValidThread());
112 request_.reset(); 118 request_.reset();
113 DVLOG(1) << "Resolved " << request_info_.host_port_pair().ToString() 119 DVLOG(1) << "Resolved " << request_info_.host_port_pair().ToString()
114 << " with error " << result << " and " << result_.size() 120 << " with error " << result << " and " << result_.size()
115 << " results!"; 121 << " results!";
116 for (const auto& address : result_) { 122 for (const auto& address : result_) {
117 DVLOG(1) << address.ToString(); 123 DVLOG(1) << address.ToString();
118 } 124 }
119 client_->ReportResult(result, result_); 125 client_->ReportResult(result, result_);
120 resolver_service_->DeleteJob(this); 126 resolver_service_->DeleteJob(iter_);
121 } 127 }
122 128
123 void MojoHostResolverImpl::Job::OnConnectionError() { 129 void MojoHostResolverImpl::Job::OnConnectionError() {
124 DCHECK(thread_checker_.CalledOnValidThread()); 130 DCHECK(thread_checker_.CalledOnValidThread());
125 // |resolver_service_| should always outlive us. 131 // |resolver_service_| should always outlive us.
126 DCHECK(resolver_service_); 132 DCHECK(resolver_service_);
127 DVLOG(1) << "Connection error on request for " 133 DVLOG(1) << "Connection error on request for "
128 << request_info_.host_port_pair().ToString(); 134 << request_info_.host_port_pair().ToString();
129 resolver_service_->DeleteJob(this); 135 resolver_service_->DeleteJob(iter_);
130 } 136 }
131 137
132 } // namespace net 138 } // namespace net
OLDNEW
« no previous file with comments | « net/dns/mojo_host_resolver_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698