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

Unified Diff: base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java

Issue 289303004: Allow native command line arguments to be initialized early. (Closed) Base URL: https://chromium.googlesource.com/chromium/src
Patch Set: Add CommandLine to CookieManagerStartUpTest Created 6 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
index 4c995129bbcf063066fac2ebe746de2b0f6c7c45..a58753d006fef1e574dacecbe36dae1e6fcd1bf6 100644
--- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
+++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
@@ -37,6 +37,11 @@ public class LibraryLoader {
// One-way switch becomes true when the libraries are loaded.
private static boolean sLoaded = false;
+ // One-way switch becomes true when the native command line is initialized (
+ // by calling nativeInitCommandLine, which forwards to
+ // InitCommandLine(...) in library_loader_hooks.cc).
+ private static boolean sCommandLineInitialized = false;
+
// One-way switch becomes true when the libraries are initialized (
// by calling nativeLibraryLoaded, which forwards to LibraryLoaded(...) in
// library_loader_hooks.cc).
@@ -83,7 +88,14 @@ public class LibraryLoader {
return;
}
loadAlreadyLocked(context, shouldDeleteOldWorkaroundLibraries);
- initializeAlreadyLocked(CommandLine.getJavaSwitchesOrNull());
+
+ // We can only call getJavaSwitchesOrNull if we have not yet
+ // switched CommandLine to native.
+ String[] switches = null;
+ if (!sCommandLineInitialized) {
+ switches = CommandLine.getJavaSwitchesOrNull();
+ }
+ initializeAlreadyLocked(switches);
}
}
@@ -200,13 +212,36 @@ public class LibraryLoader {
}
}
+ /**
+ * Set the native command line if it is has not been set yet.
+ * If the command line is set already the arguments are ignored.
+ * The library must have previously been loaded with loadNow.
+ */
+ public static void ensureCommandLineInit(String[] initCommandLine) {
bulach 2014/05/21 11:33:49 hmm... this method seems dangerous, it "ensures" b
hjd 2014/05/22 11:09:10 Yeah I felt bad writing that name... I've changed
+ synchronized (sLock) {
+ ensureCommandLineInitAlreadyLocked(initCommandLine);
+ }
+ }
+
+ private static void ensureCommandLineInitAlreadyLocked(String[] initCommandLine) {
+ if (sCommandLineInitialized) {
+ return;
+ }
+ nativeInitCommandLine(initCommandLine);
bulach 2014/05/21 11:33:49 calling an unbound method throws some fairly crypt
hjd 2014/05/22 11:09:10 I added a lot of extra LoaderErrors and checked th
+ CommandLine.enableNativeProxy();
+ sCommandLineInitialized = true;
+ }
+
// Invoke base::android::LibraryLoaded in library_loader_hooks.cc
private static void initializeAlreadyLocked(String[] initCommandLine)
throws ProcessInitException {
if (sInitialized) {
return;
}
- if (!nativeLibraryLoaded(initCommandLine)) {
+
+ ensureCommandLineInitAlreadyLocked(initCommandLine);
+
+ if (!nativeLibraryLoaded()) {
Log.e(TAG, "error calling nativeLibraryLoaded");
throw new ProcessInitException(LoaderErrors.LOADER_ERROR_FAILED_TO_REGISTER_JNI);
}
@@ -214,7 +249,6 @@ public class LibraryLoader {
// shouldn't complain from now on (and in fact, it's used by the
// following calls).
sInitialized = true;
- CommandLine.enableNativeProxy();
// From now on, keep tracing in sync with native.
TraceEvent.registerNativeEnabledObserver();
@@ -228,13 +262,16 @@ public class LibraryLoader {
nativeRecordNativeLibraryHack(sNativeLibraryHackWasUsed);
}
+ // Invokes InitCommandLine in library_loader_hooks.cc to set the native command line.
+ private static native void nativeInitCommandLine(String[] commandLine);
+
// Only methods needed before or during normal JNI registration are during System.OnLoad.
// nativeLibraryLoaded is then called to register everything else. This process is called
// "initialization". This method will be mapped (by generated code) to the LibraryLoaded
// definition in base/android/library_loader/library_loader_hooks.cc.
//
// Return true on success and false on failure.
- private static native boolean nativeLibraryLoaded(String[] initCommandLine);
+ private static native boolean nativeLibraryLoaded();
// Method called to record statistics about the Chromium linker operation,
// i.e. whether the library failed to be loaded at a fixed address, and

Powered by Google App Engine
This is Rietveld 408576698