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

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

Issue 10912132: Move ProxyConfigService construction onto the IO thread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adjust comments Created 8 years, 2 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
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/proxy/proxy_config_service_android.h" 5 #include "net/proxy/proxy_config_service_android.h"
6 6
7 #include <sys/system_properties.h> 7 #include <sys/system_properties.h>
8 8
9 #include "base/android/jni_string.h" 9 #include "base/android/jni_string.h"
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 return result.is_null() ? 154 return result.is_null() ?
155 std::string() : ConvertJavaStringToUTF8(env, result.obj()); 155 std::string() : ConvertJavaStringToUTF8(env, result.obj());
156 } 156 }
157 157
158 } // namespace 158 } // namespace
159 159
160 class ProxyConfigServiceAndroid::Delegate 160 class ProxyConfigServiceAndroid::Delegate
161 : public base::RefCountedThreadSafe<Delegate> { 161 : public base::RefCountedThreadSafe<Delegate> {
162 public: 162 public:
163 Delegate(base::SequencedTaskRunner* network_task_runner, 163 Delegate(base::SequencedTaskRunner* network_task_runner,
164 base::SequencedTaskRunner* jni_task_runner, 164 base::SequencedTaskRunner* glib_task_runner,
digit1 2012/10/19 10:32:46 same remarks in this file.
165 const GetPropertyCallback& get_property_callback) 165 const GetPropertyCallback& get_property_callback)
166 : ALLOW_THIS_IN_INITIALIZER_LIST(jni_delegate_(this)), 166 : ALLOW_THIS_IN_INITIALIZER_LIST(jni_delegate_(this)),
167 network_task_runner_(network_task_runner), 167 network_task_runner_(network_task_runner),
168 jni_task_runner_(jni_task_runner), 168 glib_task_runner_(glib_task_runner),
169 get_property_callback_(get_property_callback) { 169 get_property_callback_(get_property_callback) {
170 } 170 }
171 171
172 void SetupJNI() { 172 void SetupJNI() {
173 DCHECK(OnJNIThread()); 173 DCHECK(OnNetworkThread());
174 JNIEnv* env = AttachCurrentThread(); 174 JNIEnv* env = AttachCurrentThread();
175 if (java_proxy_change_listener_.is_null()) { 175 if (java_proxy_change_listener_.is_null()) {
176 java_proxy_change_listener_.Reset( 176 java_proxy_change_listener_.Reset(
177 Java_ProxyChangeListener_create( 177 Java_ProxyChangeListener_create(
178 env, base::android::GetApplicationContext())); 178 env, base::android::GetApplicationContext()));
179 CHECK(!java_proxy_change_listener_.is_null()); 179 CHECK(!java_proxy_change_listener_.is_null());
180 } 180 }
181 Java_ProxyChangeListener_start( 181 Java_ProxyChangeListener_start(
182 env, 182 env,
183 java_proxy_change_listener_.obj(), 183 java_proxy_change_listener_.obj(),
184 reinterpret_cast<jint>(&jni_delegate_)); 184 reinterpret_cast<jint>(&jni_delegate_));
185 } 185 }
186 186
187 void FetchInitialConfig() { 187 void FetchInitialConfig() {
188 DCHECK(OnJNIThread()); 188 DCHECK(OnNetworkThread());
189 ProxyConfig proxy_config; 189 SetNewConfigOnNetworkThread();
190 GetLatestProxyConfigInternal(get_property_callback_, &proxy_config);
191 network_task_runner_->PostTask(
192 FROM_HERE,
193 base::Bind(&Delegate::SetNewConfigOnNetworkThread, this, proxy_config));
194 } 190 }
195 191
196 void Shutdown() { 192 void StartTearDown() {
197 if (OnJNIThread()) { 193 DCHECK(OnGlibThread());
198 ShutdownOnJNIThread(); 194 if (java_proxy_change_listener_.is_null())
199 } else { 195 return;
200 jni_task_runner_->PostTask( 196 JNIEnv* env = AttachCurrentThread();
201 FROM_HERE, 197 Java_ProxyChangeListener_stop(env, java_proxy_change_listener_.obj());
202 base::Bind(&Delegate::ShutdownOnJNIThread, this));
203 }
204 } 198 }
205 199
206 // Called only on the network thread. 200 // Called only on the network thread.
207 void AddObserver(Observer* observer) { 201 void AddObserver(Observer* observer) {
208 DCHECK(OnNetworkThread()); 202 DCHECK(OnNetworkThread());
209 observers_.AddObserver(observer); 203 observers_.AddObserver(observer);
210 } 204 }
211 205
212 void RemoveObserver(Observer* observer) { 206 void RemoveObserver(Observer* observer) {
213 DCHECK(OnNetworkThread()); 207 DCHECK(OnNetworkThread());
214 observers_.RemoveObserver(observer); 208 observers_.RemoveObserver(observer);
215 } 209 }
216 210
217 ConfigAvailability GetLatestProxyConfig(ProxyConfig* config) { 211 ConfigAvailability GetLatestProxyConfig(ProxyConfig* config) {
218 DCHECK(OnNetworkThread()); 212 DCHECK(OnNetworkThread());
219 if (!config) 213 if (!config)
220 return ProxyConfigService::CONFIG_UNSET; 214 return ProxyConfigService::CONFIG_UNSET;
221 *config = proxy_config_; 215 *config = proxy_config_;
222 return ProxyConfigService::CONFIG_VALID; 216 return ProxyConfigService::CONFIG_VALID;
223 } 217 }
224 218
225 // Called on the JNI thread. 219 // Called on the glib thread.
226 void ProxySettingsChanged() { 220 void ProxySettingsChanged() {
227 DCHECK(OnJNIThread()); 221 DCHECK(OnGlibThread());
228 ProxyConfig proxy_config;
229 GetLatestProxyConfigInternal(get_property_callback_, &proxy_config);
230 network_task_runner_->PostTask( 222 network_task_runner_->PostTask(
231 FROM_HERE, 223 FROM_HERE,
232 base::Bind( 224 base::Bind(&Delegate::SetNewConfigOnNetworkThread, this));
233 &Delegate::SetNewConfigOnNetworkThread, this, proxy_config));
234 } 225 }
235 226
236 private: 227 private:
237 friend class base::RefCountedThreadSafe<Delegate>; 228 friend class base::RefCountedThreadSafe<Delegate>;
238 229
239 class JNIDelegateImpl : public ProxyConfigServiceAndroid::JNIDelegate { 230 class JNIDelegateImpl : public ProxyConfigServiceAndroid::JNIDelegate {
240 public: 231 public:
241 explicit JNIDelegateImpl(Delegate* delegate) : delegate_(delegate) {} 232 explicit JNIDelegateImpl(Delegate* delegate) : delegate_(delegate) {}
242 233
243 // ProxyConfigServiceAndroid::JNIDelegate overrides. 234 // ProxyConfigServiceAndroid::JNIDelegate overrides.
244 virtual void ProxySettingsChanged(JNIEnv*, jobject) OVERRIDE { 235 virtual void ProxySettingsChanged(JNIEnv*, jobject) OVERRIDE {
245 delegate_->ProxySettingsChanged(); 236 delegate_->ProxySettingsChanged();
246 } 237 }
247 238
248 private: 239 private:
249 Delegate* const delegate_; 240 Delegate* const delegate_;
250 }; 241 };
251 242
252 virtual ~Delegate() {} 243 virtual ~Delegate() {}
253 244
254 void ShutdownOnJNIThread() {
255 if (java_proxy_change_listener_.is_null())
256 return;
257 JNIEnv* env = AttachCurrentThread();
258 Java_ProxyChangeListener_stop(env, java_proxy_change_listener_.obj());
259 }
260
261 // Called on the network thread. 245 // Called on the network thread.
262 void SetNewConfigOnNetworkThread(const ProxyConfig& proxy_config) { 246 void SetNewConfigOnNetworkThread() {
263 DCHECK(OnNetworkThread()); 247 DCHECK(OnNetworkThread());
264 proxy_config_ = proxy_config; 248 GetLatestProxyConfigInternal(get_property_callback_, &proxy_config_);
265 FOR_EACH_OBSERVER(Observer, observers_, 249 FOR_EACH_OBSERVER(Observer, observers_,
266 OnProxyConfigChanged(proxy_config, 250 OnProxyConfigChanged(proxy_config_,
267 ProxyConfigService::CONFIG_VALID)); 251 ProxyConfigService::CONFIG_VALID));
268 } 252 }
269 253
270 bool OnJNIThread() const { 254 bool OnGlibThread() const {
271 return jni_task_runner_->RunsTasksOnCurrentThread(); 255 return glib_task_runner_->RunsTasksOnCurrentThread();
272 } 256 }
273 257
274 bool OnNetworkThread() const { 258 bool OnNetworkThread() const {
275 return network_task_runner_->RunsTasksOnCurrentThread(); 259 return network_task_runner_->RunsTasksOnCurrentThread();
276 } 260 }
277 261
278 ScopedJavaGlobalRef<jobject> java_proxy_change_listener_; 262 ScopedJavaGlobalRef<jobject> java_proxy_change_listener_;
279 263
280 JNIDelegateImpl jni_delegate_; 264 JNIDelegateImpl jni_delegate_;
281 ObserverList<Observer> observers_; 265 ObserverList<Observer> observers_;
282 scoped_refptr<base::SequencedTaskRunner> network_task_runner_; 266 scoped_refptr<base::SequencedTaskRunner> network_task_runner_;
283 scoped_refptr<base::SequencedTaskRunner> jni_task_runner_; 267 scoped_refptr<base::SequencedTaskRunner> glib_task_runner_;
284 GetPropertyCallback get_property_callback_; 268 GetPropertyCallback get_property_callback_;
285 ProxyConfig proxy_config_; 269 ProxyConfig proxy_config_;
286 270
287 DISALLOW_COPY_AND_ASSIGN(Delegate); 271 DISALLOW_COPY_AND_ASSIGN(Delegate);
288 }; 272 };
289 273
290 ProxyConfigServiceAndroid::ProxyConfigServiceAndroid( 274 ProxyConfigServiceAndroid::ProxyConfigServiceAndroid(
291 base::SequencedTaskRunner* network_task_runner, 275 base::SequencedTaskRunner* glib_task_runner,
292 base::SequencedTaskRunner* jni_task_runner) 276 base::SequencedTaskRunner* network_task_runner)
293 : delegate_(new Delegate( 277 : delegate_(new Delegate(
294 network_task_runner, jni_task_runner, base::Bind(&GetJavaProperty))) { 278 network_task_runner, glib_task_runner, base::Bind(&GetJavaProperty))) {
295 delegate_->SetupJNI(); 279 delegate_->SetupJNI();
296 delegate_->FetchInitialConfig(); 280 delegate_->FetchInitialConfig();
297 } 281 }
298 282
299 ProxyConfigServiceAndroid::~ProxyConfigServiceAndroid() { 283 ProxyConfigServiceAndroid::~ProxyConfigServiceAndroid() {}
300 delegate_->Shutdown(); 284
285 void ProxyConfigServiceAndroid::StartTearDown() {
286 delegate_->StartTearDown();
301 } 287 }
302 288
303 // static 289 // static
304 bool ProxyConfigServiceAndroid::Register(JNIEnv* env) { 290 bool ProxyConfigServiceAndroid::Register(JNIEnv* env) {
305 return RegisterNativesImpl(env); 291 return RegisterNativesImpl(env);
306 } 292 }
307 293
308 void ProxyConfigServiceAndroid::AddObserver(Observer* observer) { 294 void ProxyConfigServiceAndroid::AddObserver(Observer* observer) {
309 delegate_->AddObserver(observer); 295 delegate_->AddObserver(observer);
310 } 296 }
311 297
312 void ProxyConfigServiceAndroid::RemoveObserver(Observer* observer) { 298 void ProxyConfigServiceAndroid::RemoveObserver(Observer* observer) {
313 delegate_->RemoveObserver(observer); 299 delegate_->RemoveObserver(observer);
314 } 300 }
315 301
316 ProxyConfigService::ConfigAvailability 302 ProxyConfigService::ConfigAvailability
317 ProxyConfigServiceAndroid::GetLatestProxyConfig(ProxyConfig* config) { 303 ProxyConfigServiceAndroid::GetLatestProxyConfig(ProxyConfig* config) {
318 return delegate_->GetLatestProxyConfig(config); 304 return delegate_->GetLatestProxyConfig(config);
319 } 305 }
320 306
321 ProxyConfigServiceAndroid::ProxyConfigServiceAndroid( 307 ProxyConfigServiceAndroid::ProxyConfigServiceAndroid(
322 base::SequencedTaskRunner* network_task_runner, 308 base::SequencedTaskRunner* network_task_runner,
323 base::SequencedTaskRunner* jni_task_runner, 309 base::SequencedTaskRunner* glib_task_runner,
324 GetPropertyCallback get_property_callback) 310 GetPropertyCallback get_property_callback)
325 : delegate_(new Delegate( 311 : delegate_(new Delegate(
326 network_task_runner, jni_task_runner, get_property_callback)) { 312 network_task_runner, glib_task_runner, get_property_callback)) {
327 delegate_->FetchInitialConfig(); 313 delegate_->FetchInitialConfig();
328 } 314 }
329 315
330 void ProxyConfigServiceAndroid::ProxySettingsChanged() { 316 void ProxyConfigServiceAndroid::ProxySettingsChanged() {
331 delegate_->ProxySettingsChanged(); 317 delegate_->ProxySettingsChanged();
332 } 318 }
333 319
334 } // namespace net 320 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698