| 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
|
| index 0ce0b5430f2fcfe233de5cb98a9ce86e3ef0da91..59d9b326b92d59228617b6a02847d66fb900524b 100644
|
| --- a/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java
|
| +++ b/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java
|
| @@ -17,23 +17,24 @@ import org.chromium.base.annotations.JNINamespace;
|
| */
|
| @JNINamespace("cronet")
|
| class CronetLibraryLoader {
|
| - /**
|
| - * Synchronize access to sInitTaskPosted and initialization routine.
|
| - */
|
| + // Synchronize initialization.
|
| private static final Object sLoadLock = new Object();
|
| private static final String TAG = "CronetLibraryLoader";
|
| - private static boolean sInitTaskPosted = false;
|
| + // Has library loading commenced? Setting guarded by sLoadLock.
|
| + private static volatile boolean sInitStarted = false;
|
| + // Has ensureMainThreadInitialized() completed? Only accessed on main thread.
|
| + private static boolean sMainThreadInitDone = 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 CronetEngine.Builder builder) {
|
| + static void ensureInitialized(final Context context, final CronetEngine.Builder builder) {
|
| synchronized (sLoadLock) {
|
| - if (sInitTaskPosted) {
|
| + if (sInitStarted) {
|
| return;
|
| }
|
| + sInitStarted = true;
|
| builder.loadLibrary();
|
| if (!Version.CRONET_VERSION.equals(nativeGetCronetVersion())) {
|
| throw new RuntimeException(String.format(
|
| @@ -48,7 +49,7 @@ class CronetLibraryLoader {
|
| // Init native Chromium CronetEngine on Main UI thread.
|
| Runnable task = new Runnable() {
|
| public void run() {
|
| - initOnMainThread(context);
|
| + ensureInitializedOnMainThread(context);
|
| }
|
| };
|
| // Run task immediately or post it to the UI thread.
|
| @@ -59,11 +60,20 @@ class CronetLibraryLoader {
|
| // to other tasks posted to the main thread.
|
| new Handler(Looper.getMainLooper()).post(task);
|
| }
|
| - sInitTaskPosted = true;
|
| }
|
| }
|
|
|
| - private static void initOnMainThread(final Context context) {
|
| + /**
|
| + * Ensure that the main thread initialization has completed. Can only be called from
|
| + * the main thread. Ensures that the NetworkChangeNotifier is initialzied and the
|
| + * main thread native MessageLoop is initialized.
|
| + */
|
| + static void ensureInitializedOnMainThread(Context context) {
|
| + assert sInitStarted;
|
| + assert Looper.getMainLooper() == Looper.myLooper();
|
| + if (sMainThreadInitDone) {
|
| + return;
|
| + }
|
| NetworkChangeNotifier.init(context);
|
| // Registers to always receive network notifications. Note
|
| // that this call is fine for Cronet because Cronet
|
| @@ -76,6 +86,7 @@ class CronetLibraryLoader {
|
| // the undesired initial network change observer notification, which
|
| // will cause active requests to fail with ERR_NETWORK_CHANGED.
|
| nativeCronetInitOnMainThread();
|
| + sMainThreadInitDone = true;
|
| }
|
|
|
| // Native methods are implemented in cronet_library_loader.cc.
|
|
|