Index: base/android/java/src/org/chromium/base/library_loader/Linker.java |
diff --git a/base/android/java/src/org/chromium/base/library_loader/Linker.java b/base/android/java/src/org/chromium/base/library_loader/Linker.java |
index 23f953c24a8c7693209374a90acc87c4eeb1d4be..c7082411ab6cd30dd61344d65370123379a2a932 100644 |
--- a/base/android/java/src/org/chromium/base/library_loader/Linker.java |
+++ b/base/android/java/src/org/chromium/base/library_loader/Linker.java |
@@ -106,16 +106,15 @@ import javax.annotation.Nullable; |
* running any native code from any of the libraries (except their static |
* constructors, which can't be avoided). |
* |
- * - A service process shall call either initServiceProcess() or |
- * disableSharedRelros() early (i.e. before any loadLibrary() call). |
- * Otherwise, the linker considers that it is running inside the browser |
- * process. This is because various Chromium projects have vastly |
- * different initialization paths. |
+ * - A service process shall call initServiceProcess() early (i.e. before any |
+ * loadLibrary() call). Otherwise, the linker considers that it is running |
+ * inside the browser process. This is because various Chromium projects have |
+ * vastly different initialization paths. |
* |
* disableSharedRelros() completely disables shared RELROs, and loadLibrary() |
* will behave exactly like System.loadLibrary(). |
* |
- * initServiceProcess(baseLoadAddress) indicates that shared RELROs are to be |
+ * enableSharedRelros(baseLoadAddress) indicates that shared RELROs are to be |
* used in this process. |
* |
* - The browser is in charge of deciding where in memory each library should |
@@ -197,8 +196,6 @@ public class Linker { |
private static boolean sRelroSharingSupported = false; |
// Set to true if this runs in the browser process. Disabled by initServiceProcess(). |
- // TODO(petrcermak): This flag can be incorrectly set to false (even though this might run in |
- // the browser process) on low-memory devices. |
private static boolean sInBrowserProcess = true; |
// Becomes true to indicate this process needs to wait for a shared RELRO in |
@@ -487,7 +484,7 @@ public class Linker { |
/** |
* Call this to send a Bundle containing the shared RELRO sections to be |
- * used in this process. If initServiceProcess() was previously called, |
+ * used in this process. If enableSharedRelros() was previously called, |
* finishLibraryLoad() will not exit until this method is called in another |
* thread with a non-null value. |
* @param bundle The Bundle instance containing a map of shared RELRO sections |
@@ -513,7 +510,7 @@ public class Linker { |
} |
synchronized (Linker.class) { |
// Note that in certain cases, this can be called before |
- // initServiceProcess() in service processes. |
+ // enableSharedRelros() in service processes. |
sSharedRelros = clonedBundle; |
// Tell any listener blocked in finishLibraryLoad() about it. |
Linker.class.notifyAll(); |
@@ -540,35 +537,45 @@ public class Linker { |
} |
} |
+ /** |
+ * Call this method before enabling/disabling shared RELRO sections to |
+ * indicate that this is a service process (i.e. not a browser process). |
+ */ |
+ public static void initServiceProcess() { |
+ if (DEBUG) Log.i(TAG, "initServiceProcess() called"); |
+ synchronized (Linker.class) { |
+ sInBrowserProcess = false; |
+ sBrowserUsesSharedRelro = false; |
+ } |
+ } |
/** |
* Call this method before loading any libraries to indicate that this |
- * process shall neither create or reuse shared RELRO sections. |
+ * process shall neither create nor reuse shared RELRO sections. |
*/ |
public static void disableSharedRelros() { |
if (DEBUG) Log.i(TAG, "disableSharedRelros() called"); |
synchronized (Linker.class) { |
- sInBrowserProcess = false; |
sWaitForSharedRelros = false; |
- sBrowserUsesSharedRelro = false; |
} |
} |
/** |
* Call this method before loading any libraries to indicate that this |
* process is ready to reuse shared RELRO sections from another one. |
- * Typically used when starting service processes. |
+ * Typically used when starting service processes. Any calls to this method |
+ * must be preceded by initServiceProcess(). |
* @param baseLoadAddress the base library load address to use. |
*/ |
- public static void initServiceProcess(long baseLoadAddress) { |
+ public static void enableSharedRelros(long baseLoadAddress) { |
if (DEBUG) { |
Log.i(TAG, String.format( |
- Locale.US, "initServiceProcess(0x%x) called", baseLoadAddress)); |
+ Locale.US, "enableSharedRelros(0x%x) called", baseLoadAddress)); |
} |
synchronized (Linker.class) { |
+ assert !sInBrowserProcess; |
+ assert !sBrowserUsesSharedRelro; |
rmcilroy
2015/02/17 17:30:33
As discussed, maybe we should consider packaging t
|
ensureInitializedLocked(); |
- sInBrowserProcess = false; |
- sBrowserUsesSharedRelro = false; |
if (sRelroSharingSupported) { |
sWaitForSharedRelros = true; |
sBaseLoadAddress = baseLoadAddress; |