Chromium Code Reviews| 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..86461353d2de2efb3420daf6e16b47a20ff9c9d5 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 |
| @@ -21,7 +21,6 @@ import org.chromium.base.JNINamespace; |
| import org.chromium.content.browser.ChildProcessConnection; |
| import org.chromium.content.common.IChildProcessCallback; |
| import org.chromium.content.common.IChildProcessService; |
| -import org.chromium.content.browser.ChildProcessLauncher; |
| import org.chromium.content.common.ProcessInitException; |
| import java.util.ArrayList; |
| @@ -52,9 +51,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. |
| + private boolean mIsBound = false; |
| // Binder object used by clients for this service. |
| private final IChildProcessService.Stub mBinder = new IChildProcessService.Stub() { |
| @@ -89,6 +92,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); |
|
palmer
2013/10/01 00:11:22
How sure are we that only the browser could invoke
digit1
2013/10/01 15:40:20
Yes, this is part of the existing code for startin
|
| + sharedRelros = null; |
| + } |
| mMainThread.notifyAll(); |
| } |
| return Process.myPid(); |
| @@ -112,6 +120,18 @@ 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 && mLinkerParams.mWaitForSharedRelro) |
| + Linker.initServiceProcess(mLinkerParams.mBaseLoadAddress); |
| + else |
| + Linker.disableSharedRelros(); |
| + } |
| try { |
| LibraryLoader.loadNow(); |
| } catch (ProcessInitException e) { |
| @@ -188,6 +208,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(); |
| } |