Index: content/public/android/java/src/org/chromium/content/app/ChildProcessService.java |
diff --git a/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java b/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java |
index 3d85310926cb657db415002f0e5e2b7bc5eb8090..d5ab06d4fe56c84cd80be76133e1ffd986d1faaf 100644 |
--- a/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java |
+++ b/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java |
@@ -52,9 +52,13 @@ public class ChildProcessService extends Service { |
// Pairs IDs and file descriptors that should be registered natively. |
private ArrayList<Integer> mFileIds; |
private ArrayList<ParcelFileDescriptor> mFileFds; |
+ // Linker-specific parameters for this child process service. |
+ private LinkerParams mLinkerParams; |
private static AtomicReference<Context> sContext = new AtomicReference<Context>(null); |
private boolean mLibraryInitialized = false; |
+ // Becomes true once the service is bound. Access must synchronize around mMainThread. |
+ private boolean mIsBound = false; |
// Binder object used by clients for this service. |
private final IChildProcessService.Stub mBinder = new IChildProcessService.Stub() { |
@@ -89,6 +93,11 @@ public class ChildProcessService extends Service { |
+ ChildProcessConnection.EXTRA_FILES_ID_SUFFIX; |
mFileIds.add(args.getInt(idName)); |
} |
+ Bundle sharedRelros = args.getBundle(Linker.EXTRA_LINKER_SHARED_RELROS); |
+ if (sharedRelros != null) { |
+ Linker.useSharedRelros(sharedRelros); |
+ sharedRelros = null; |
+ } |
mMainThread.notifyAll(); |
} |
return Process.myPid(); |
@@ -112,6 +121,22 @@ public class ChildProcessService extends Service { |
@Override |
public void run() { |
try { |
+ boolean useLinker = Linker.isUsed(); |
+ |
+ if (useLinker) { |
+ synchronized (mMainThread) { |
+ while (!mIsBound) |
+ mMainThread.wait(); |
+ } |
+ if (mLinkerParams != null) { |
+ if (mLinkerParams.mWaitForSharedRelro) |
+ Linker.initServiceProcess(mLinkerParams.mBaseLoadAddress); |
+ else |
+ Linker.disableSharedRelros(); |
+ |
+ Linker.setTestRunnerClassName(mLinkerParams.mTestRunnerClassName); |
+ } |
+ } |
try { |
LibraryLoader.loadNow(); |
} catch (ProcessInitException e) { |
@@ -188,6 +213,10 @@ public class ChildProcessService extends Service { |
synchronized (mMainThread) { |
mCommandLineParams = intent.getStringArrayExtra( |
ChildProcessConnection.EXTRA_COMMAND_LINE); |
+ mLinkerParams = null; |
+ if (Linker.isUsed()) |
+ mLinkerParams = new LinkerParams(intent); |
+ mIsBound = true; |
mMainThread.notifyAll(); |
} |