Chromium Code Reviews| Index: components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java |
| diff --git a/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java b/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..3e49a3ad799e6b3f7b2ced65f3a4afa5adab3935 |
| --- /dev/null |
| +++ b/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java |
| @@ -0,0 +1,69 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package org.chromium.net; |
| + |
| +import android.content.Context; |
| +import android.os.Handler; |
| +import android.os.Looper; |
| + |
| +import org.chromium.base.JNINamespace; |
| + |
| +/** |
| + * CronetLibraryLoader loads and initializes native library on main thread. |
| + */ |
| +@JNINamespace("cronet") |
| +public class CronetLibraryLoader { |
| + /** |
| + * Synchronize access to mInitComplete and initialization routine. |
| + */ |
| + private static final Object sLoadAndInitLock = new Object(); |
| + private static boolean sLoadAndInitComplete = false; |
| + |
| + /** |
| + * Ensure that native library is loaded and initialized. Can be called from |
| + * any thread, the load and initialization is performed on main thread. |
| + */ |
| + public static void ensureInitialized( |
| + final Context context, final UrlRequestContextConfig config) { |
| + synchronized (sLoadAndInitLock) { |
| + if (sLoadAndInitComplete) { |
| + return; |
| + } |
| + System.loadLibrary(config.libraryName()); |
| + // Init native Chromium URLRequestContext on Main UI thread. |
| + Runnable task = new Runnable() { |
| + public void run() { |
| + initOnMainThread(context); |
| + } |
| + }; |
| + // Run task immediately or post it to the UI thread. |
| + if (Looper.getMainLooper() == Looper.myLooper()) { |
|
mmenke
2015/01/08 19:06:16
If we're on a random executor thread, what does Lo
mef
2015/01/08 21:17:02
Returns null if the calling thread is not associat
|
| + task.run(); |
| + } else { |
| + new Handler(Looper.getMainLooper()).post(task); |
| + } |
| + } |
| + } |
| + |
| + private static void initOnMainThread(final Context context) { |
| + synchronized (sLoadAndInitLock) { |
| + if (sLoadAndInitComplete) { |
| + return; |
| + } |
| + NetworkChangeNotifier.init(context); |
| + // Registers to always receive network notifications. Note |
| + // that this call is fine for Cronet because Cronet |
| + // embedders do not have API access to create network change |
| + // observers. Existing observers in the net stack do not |
| + // perform expensive work. |
| + NetworkChangeNotifier.registerToReceiveNotificationsAlways(); |
| + nativeCronetInitOnMainThread(context); |
| + sLoadAndInitComplete = true; |
|
mmenke
2015/01/08 19:06:16
IS there a reason we have to set load and init com
mef
2015/01/08 21:17:02
In order to set sLoadAndInitComplete in ensureInit
mmenke
2015/01/12 15:28:26
I don't follow. We're not blocking anywhere until
mef
2015/01/12 17:19:56
Done.
|
| + } |
| + } |
| + |
| + // Native methods are implemented in cronet_loader.cc. |
| + private static native long nativeCronetInitOnMainThread(Context context); |
| +} |