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

Side by Side Diff: net/proxy/proxy_resolver_mojo.cc

Issue 1076083002: Shut down proxy resolver utility processes when no longer needed. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@proxy-service-with-factory-restart
Patch Set: Created 5 years, 8 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
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/proxy/proxy_resolver_mojo.h" 5 #include "net/proxy/proxy_resolver_mojo.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "mojo/common/common_type_converters.h" 10 #include "mojo/common/common_type_converters.h"
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 callback_.Reset(); 104 callback_.Reset();
105 resolver_->RemoveJob(this); 105 resolver_->RemoveJob(this);
106 callback.Run(error); 106 callback.Run(error);
107 } 107 }
108 108
109 void ProxyResolverMojo::Job::LoadStateChanged(int32_t load_state) { 109 void ProxyResolverMojo::Job::LoadStateChanged(int32_t load_state) {
110 load_state_ = static_cast<LoadState>(load_state); 110 load_state_ = static_cast<LoadState>(load_state);
111 } 111 }
112 112
113 ProxyResolverMojo::ProxyResolverMojo( 113 ProxyResolverMojo::ProxyResolverMojo(
114 MojoProxyResolverFactory* mojo_proxy_resolver_factory, 114 interfaces::ProxyResolverPtr mojo_proxy_resolver,
115 HostResolver* host_resolver) 115 scoped_ptr<base::ScopedClosureRunner> runner)
116 : ProxyResolver(true /* |expects_pac_bytes| */), 116 : ProxyResolver(true /* |expects_pac_bytes| */),
117 mojo_proxy_resolver_factory_(mojo_proxy_resolver_factory), 117 mojo_proxy_resolver_ptr_(mojo_proxy_resolver.Pass()),
118 host_resolver_(host_resolver), 118 runner_(runner.Pass()),
119 weak_factory_(this) { 119 weak_factory_(this) {
120 mojo_proxy_resolver_ptr_.set_error_handler(this);
120 } 121 }
121 122
122 ProxyResolverMojo::~ProxyResolverMojo() { 123 ProxyResolverMojo::~ProxyResolverMojo() {
123 DCHECK(thread_checker_.CalledOnValidThread()); 124 DCHECK(thread_checker_.CalledOnValidThread());
124 // All pending requests should have been cancelled. 125 // All pending requests should have been cancelled.
125 DCHECK(pending_jobs_.empty()); 126 DCHECK(pending_jobs_.empty());
126 DCHECK(set_pac_script_callback_.IsCancelled()); 127 DCHECK(set_pac_script_callback_.IsCancelled());
127 } 128 }
128 129
129 void ProxyResolverMojo::CancelSetPacScript() { 130 void ProxyResolverMojo::CancelSetPacScript() {
(...skipping 11 matching lines...) Expand all
141 pac_script->utf16().empty()) { 142 pac_script->utf16().empty()) {
142 return ERR_PAC_SCRIPT_FAILED; 143 return ERR_PAC_SCRIPT_FAILED;
143 } 144 }
144 145
145 DVLOG(1) << "ProxyResolverMojo::SetPacScript: " << pac_script->utf16(); 146 DVLOG(1) << "ProxyResolverMojo::SetPacScript: " << pac_script->utf16();
146 set_pac_script_callback_.Reset( 147 set_pac_script_callback_.Reset(
147 base::Bind(&ProxyResolverMojo::OnSetPacScriptDone, base::Unretained(this), 148 base::Bind(&ProxyResolverMojo::OnSetPacScriptDone, base::Unretained(this),
148 pac_script, callback)); 149 pac_script, callback));
149 150
150 if (!mojo_proxy_resolver_ptr_) 151 if (!mojo_proxy_resolver_ptr_)
151 SetUpServices(); 152 return ERR_PAC_SCRIPT_TERMINATED;
152 153
153 mojo_proxy_resolver_ptr_->SetPacScript( 154 mojo_proxy_resolver_ptr_->SetPacScript(
154 mojo::String::From(pac_script->utf16()), 155 mojo::String::From(pac_script->utf16()),
155 set_pac_script_callback_.callback()); 156 set_pac_script_callback_.callback());
156 157
157 return ERR_IO_PENDING; 158 return ERR_IO_PENDING;
158 } 159 }
159 160
160 void ProxyResolverMojo::OnSetPacScriptDone( 161 void ProxyResolverMojo::OnSetPacScriptDone(
161 const scoped_refptr<ProxyResolverScriptData>& pac_script, 162 const scoped_refptr<ProxyResolverScriptData>& pac_script,
162 const net::CompletionCallback& callback, 163 const net::CompletionCallback& callback,
163 int32_t result) { 164 int32_t result) {
164 DCHECK(thread_checker_.CalledOnValidThread()); 165 DCHECK(thread_checker_.CalledOnValidThread());
165 DCHECK(!set_pac_script_callback_.IsCancelled()); 166 DCHECK(!set_pac_script_callback_.IsCancelled());
166 DVLOG(1) << "ProxyResolverMojo::OnSetPacScriptDone: " << result; 167 DVLOG(1) << "ProxyResolverMojo::OnSetPacScriptDone: " << result;
167 168
168 // |callback| is owned by |set_pac_script_callback_|, so make a copy before 169 // |callback| is owned by |set_pac_script_callback_|, so make a copy before
169 // cancelling. 170 // cancelling.
170 auto callback_copy = callback; 171 auto callback_copy = callback;
171 set_pac_script_callback_.Cancel(); 172 set_pac_script_callback_.Cancel();
172 callback_copy.Run(result); 173 callback_copy.Run(result);
173 } 174 }
174 175
175 void ProxyResolverMojo::SetUpServices() {
176 DCHECK(thread_checker_.CalledOnValidThread());
177 // A Mojo service implementation must outlive its binding.
178 mojo_host_resolver_binding_.reset();
179
180 interfaces::HostResolverPtr mojo_host_resolver_ptr;
181 mojo_host_resolver_.reset(new MojoHostResolverImpl(host_resolver_));
182 mojo_host_resolver_binding_.reset(new mojo::Binding<interfaces::HostResolver>(
183 mojo_host_resolver_.get(), mojo::GetProxy(&mojo_host_resolver_ptr)));
184 mojo_proxy_resolver_ptr_.reset();
185 mojo_proxy_resolver_factory_->Create(
186 mojo::GetProxy(&mojo_proxy_resolver_ptr_), mojo_host_resolver_ptr.Pass());
187 mojo_proxy_resolver_ptr_.set_error_handler(this);
188 }
189
190 void ProxyResolverMojo::AbortPendingRequests() { 176 void ProxyResolverMojo::AbortPendingRequests() {
191 DCHECK(thread_checker_.CalledOnValidThread()); 177 DCHECK(thread_checker_.CalledOnValidThread());
192 // |this| could be deleted as a result of one of these callbacks so use 178 // |this| could be deleted as a result of one of these callbacks so use
193 // |weak_this| to check. 179 // |weak_this| to check.
194 base::WeakPtr<ProxyResolverMojo> weak_this = weak_factory_.GetWeakPtr(); 180 base::WeakPtr<ProxyResolverMojo> weak_this = weak_factory_.GetWeakPtr();
195 if (!set_pac_script_callback_.IsCancelled()) 181 if (!set_pac_script_callback_.IsCancelled())
196 set_pac_script_callback_.callback().Run(ERR_PAC_SCRIPT_TERMINATED); 182 set_pac_script_callback_.callback().Run(ERR_PAC_SCRIPT_TERMINATED);
197 183
198 // Need to use this loop because deleting a Job will cause its callback to be 184 // Need to use this loop because deleting a Job will cause its callback to be
199 // run with a failure error code, which may cause other Jobs to be deleted. 185 // run with a failure error code, which may cause other Jobs to be deleted.
(...skipping 29 matching lines...) Expand all
229 delete job; 215 delete job;
230 } 216 }
231 217
232 int ProxyResolverMojo::GetProxyForURL(const GURL& url, 218 int ProxyResolverMojo::GetProxyForURL(const GURL& url,
233 ProxyInfo* results, 219 ProxyInfo* results,
234 const net::CompletionCallback& callback, 220 const net::CompletionCallback& callback,
235 RequestHandle* request, 221 RequestHandle* request,
236 const BoundNetLog& net_log) { 222 const BoundNetLog& net_log) {
237 DCHECK(thread_checker_.CalledOnValidThread()); 223 DCHECK(thread_checker_.CalledOnValidThread());
238 224
239 // If the Mojo service is not connected, fail. The Mojo service is connected 225 if (!mojo_proxy_resolver_ptr_)
240 // when the script is set, which must be done after construction and after a
241 // previous request returns ERR_PAC_SCRIPT_TERMINATED due to the Mojo proxy
242 // resolver process crashing.
243 if (!mojo_proxy_resolver_ptr_) {
244 DVLOG(1) << "ProxyResolverMojo::GetProxyForURL: Mojo not connected";
245 return ERR_PAC_SCRIPT_TERMINATED; 226 return ERR_PAC_SCRIPT_TERMINATED;
246 }
247 227
248 Job* job = new Job(this, url, results, callback); 228 Job* job = new Job(this, url, results, callback);
249 bool inserted = pending_jobs_.insert(job).second; 229 bool inserted = pending_jobs_.insert(job).second;
250 DCHECK(inserted); 230 DCHECK(inserted);
251 *request = job; 231 *request = job;
252 232
253 return ERR_IO_PENDING; 233 return ERR_IO_PENDING;
254 } 234 }
255 235
256 void ProxyResolverMojo::CancelRequest(RequestHandle request) { 236 void ProxyResolverMojo::CancelRequest(RequestHandle request) {
257 DCHECK(thread_checker_.CalledOnValidThread()); 237 DCHECK(thread_checker_.CalledOnValidThread());
258 Job* job = static_cast<Job*>(request); 238 Job* job = static_cast<Job*>(request);
259 DCHECK(job); 239 DCHECK(job);
260 job->Cancel(); 240 job->Cancel();
261 RemoveJob(job); 241 RemoveJob(job);
262 } 242 }
263 243
264 LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const { 244 LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const {
265 Job* job = static_cast<Job*>(request); 245 Job* job = static_cast<Job*>(request);
266 CHECK_EQ(1u, pending_jobs_.count(job)); 246 CHECK_EQ(1u, pending_jobs_.count(job));
267 return job->load_state(); 247 return job->load_state();
268 } 248 }
269 249
270 } // namespace net 250 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698