Index: content/public/android/java/org/chromium/content/browser/LibraryLoader.java |
diff --git a/content/public/android/java/org/chromium/content/browser/LibraryLoader.java b/content/public/android/java/org/chromium/content/browser/LibraryLoader.java |
deleted file mode 100644 |
index ee9b35886111c4164c28b7aa0c64ec1c04c92e12..0000000000000000000000000000000000000000 |
--- a/content/public/android/java/org/chromium/content/browser/LibraryLoader.java |
+++ /dev/null |
@@ -1,239 +0,0 @@ |
-// Copyright (c) 2012 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.content.browser; |
- |
-import android.os.AsyncTask; |
-import android.os.Handler; |
-import android.text.TextUtils; |
-import android.util.Log; |
- |
-// This class provides functionality to: |
-// - synchronously load and register the native library. This is used by callers |
-// that can't do anything useful without the native side. |
-// - asynchronously load and register the native library. This is used by callers |
-// that can do more work in the java-side, and let a separate thread do all the |
-// file IO and library loading. |
-public class LibraryLoader { |
- private static final String TAG = "LibraryLoader"; |
- |
- /* TODO(jrg): resolve up and downstream discrepancy; there is no |
- * upstream libchromeview.so */ |
- private static String sLibrary = "chromeview"; |
- |
- private static boolean sLoaded = false; |
- |
- private static boolean sInitialized = false; |
- |
- private static AsyncTask<Void, Void, Boolean> sAsyncLoader; |
- |
- /** |
- * Callback for handling loading of the native library. |
- * |
- * <p> The callback methods will always be triggered on the UI thread. |
- */ |
- public static interface Callback { |
- /** |
- * Called when loading the native library is successful. |
- */ |
- void onSuccess(); |
- |
- /** |
- * Called when loading the native library fails. |
- */ |
- void onFailure(); |
- } |
- |
- /** |
- * Sets the library name that is to be loaded. This must be called prior to the library being |
- * loaded the first time. |
- * |
- * @param library The name of the library to be loaded (without the lib prefix). |
- */ |
- public static void setLibraryToLoad(String library) { |
- if (TextUtils.equals(sLibrary, library)) return; |
- |
- assert !sLoaded : "Setting the library must happen before load is called."; |
- sLibrary = library; |
- } |
- |
- /** |
- * This method blocks until the library is fully loaded and initialized; |
- * must be called on the thread that the native will call its "main" thread. |
- */ |
- public static void loadAndInitSync() { |
- checkThreadUsage(); |
- if (sInitialized) { |
- // Already initialized, nothing to do. |
- return; |
- } |
- if (sAsyncLoader != null) { |
- // Async initialization in progress, wait. |
- waitForAsyncInitialized(); |
- return; |
- } |
- loadNow(); |
- initializeOnMainThread(); |
- } |
- |
- /** |
- * Block until the library is fully initialized. |
- * Must be called on the thread that the native will call its "main" thread. |
- */ |
- private static void waitForAsyncInitialized() { |
- checkThreadUsage(); |
- if (sInitialized) { |
- // Already initialized. |
- return; |
- } |
- synchronized(LibraryLoader.class) { |
- try { |
- while (!sLoaded) { |
- LibraryLoader.class.wait(); |
- } |
- // If the UI thread blocked waiting for the task it will already |
- // have handled the library load completion, so don't duplicate that work here. |
- } catch (InterruptedException e) { |
- } |
- } |
- initializeOnMainThread(); |
- } |
- |
- /** |
- * Kicks off an asynchronous library load, and will asynchronously initialize the |
- * library when that completes. |
- * Must be called on the thread that the native will call its "main" thread. |
- */ |
- public static void loadAndInitAsync(final Callback onLoadedListener) { |
- checkThreadUsage(); |
- if (sInitialized) { |
- // Already initialized, post our Runnable if needed. |
- if (onLoadedListener != null) { |
- new Handler().post(new Runnable() { |
- @Override |
- public void run() { |
- onLoadedListener.onSuccess(); |
- } |
- }); |
- } |
- return; |
- } |
- sAsyncLoader = new AsyncTask<Void, Void, Boolean>() { |
- @Override |
- public Boolean doInBackground(Void... voids) { |
- // We're loading the .so in a background thread. Potentially, this |
- // can break native code that relies on static initializers using |
- // thread local storage, as the library would normally load in the |
- // main thread. If do we hit such cases we should remove those static |
- // initializers, as we chrome has banned them. |
- // (Worst case, we can go back to just warming up the file in the system |
- // cache here and do the actual loading in onPostExecute().) |
- return loadNow(); |
- } |
- |
- @Override |
- protected void onPostExecute(Boolean result) { |
- if (result) { |
- initializeOnMainThread(); |
- if (onLoadedListener != null) onLoadedListener.onSuccess(); |
- } else { |
- if (onLoadedListener != null) onLoadedListener.onFailure(); |
- } |
- |
- } |
- }; |
- sAsyncLoader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); |
- } |
- |
- /** |
- * @throws UnsatisfiedLinkError if the library is not yet initialized. |
- */ |
- public static void checkIsReady() { |
- if (!sInitialized) { |
- throw new UnsatisfiedLinkError(sLibrary + " is not initialized"); |
- } |
- } |
- |
- /** |
- * Loads the library and blocks until the load completes. The caller is responsible |
- * for subsequently calling initialize(). |
- * May be called on any thread, but should only be called once. Note the thread |
- * this is called on will be the thread that runs the native code's static initializers. |
- * See the comment in doInBackground() for more considerations on this. |
- * |
- * @return Whether the native library was successfully loaded. |
- */ |
- static boolean loadNow() { |
- assert !sInitialized; |
- try { |
- Log.i(TAG, "loading: " + sLibrary); |
- System.loadLibrary(sLibrary); |
- Log.i(TAG, "loaded: " + sLibrary); |
- synchronized(LibraryLoader.class) { |
- sLoaded = true; |
- LibraryLoader.class.notifyAll(); |
- } |
- } catch (UnsatisfiedLinkError e) { |
- Log.e(TAG, "error loading: " + sLibrary, e); |
- return false; |
- } |
- return true; |
- } |
- |
- /** |
- * initializes the library here and now: must be called on the thread that the |
- * native will call its "main" thread. The library must have previously been |
- * loaded with loadNow. |
- * @param initCommandLine The command line arguments that native command line will |
- * be initialized with. |
- */ |
- static void initializeOnMainThread(String[] initCommandLine) { |
- checkThreadUsage(); |
- if (sInitialized) { |
- return; |
- } |
- if (!nativeLibraryLoadedOnMainThread(initCommandLine)) { |
- Log.e(TAG, "error calling nativeLibraryLoadedOnMainThread"); |
- throw new UnsatisfiedLinkError(); |
- } |
- // From this point on, native code is ready to use and checkIsReady() |
- // shouldn't complain from now on (and in fact, it's used by the |
- // following calls). |
- sInitialized = true; |
- CommandLine.enableNativeProxy(); |
- TraceEvent.setEnabledToMatchNative(); |
- } |
- |
- static private void initializeOnMainThread() { |
- checkThreadUsage(); |
- if (!sInitialized) { |
- initializeOnMainThread(CommandLine.getJavaSwitchesOrNull()); |
- } |
- } |
- |
- private LibraryLoader() { |
- } |
- |
- // The public API of this class is meant to be used from a single |
- // thread. Internally, we may bounce to a separate thread to actually |
- // load the library. |
- private static Thread sMyThread; |
- private static void checkThreadUsage() { |
- Thread currentThread = java.lang.Thread.currentThread(); |
- if (sMyThread == null) { |
- sMyThread = currentThread; |
- } else { |
- if (sMyThread != currentThread) { |
- Log.e(TAG, "Threading violation detected. My thread=" + sMyThread + |
- " but I'm being accessed from thread=" + currentThread); |
- assert false; |
- } |
- } |
- } |
- |
- // This is the only method that is registered during System.loadLibrary, as it |
- // happens on a different thread. We then call it on the main thread to register |
- // everything else. |
- private static native boolean nativeLibraryLoadedOnMainThread(String[] initCommandLine); |
-} |