| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.content.browser; | 5 package org.chromium.content.browser; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 import android.os.Bundle; | 8 import android.os.Bundle; |
| 9 import android.os.IBinder; | 9 import android.os.IBinder; |
| 10 import android.os.RemoteException; | 10 import android.os.RemoteException; |
| 11 | 11 |
| 12 import org.chromium.base.CpuFeatures; | 12 import org.chromium.base.CpuFeatures; |
| 13 import org.chromium.base.Log; | 13 import org.chromium.base.Log; |
| 14 import org.chromium.base.ThreadUtils; | 14 import org.chromium.base.ThreadUtils; |
| 15 import org.chromium.base.TraceEvent; | 15 import org.chromium.base.TraceEvent; |
| 16 import org.chromium.base.VisibleForTesting; | 16 import org.chromium.base.VisibleForTesting; |
| 17 import org.chromium.base.library_loader.Linker; | 17 import org.chromium.base.library_loader.Linker; |
| 18 import org.chromium.base.process_launcher.BaseChildProcessConnection; |
| 19 import org.chromium.base.process_launcher.BindingManager; |
| 20 import org.chromium.base.process_launcher.BindingManagerImpl; |
| 18 import org.chromium.base.process_launcher.ChildProcessCreationParams; | 21 import org.chromium.base.process_launcher.ChildProcessCreationParams; |
| 19 import org.chromium.base.process_launcher.FileDescriptorInfo; | 22 import org.chromium.base.process_launcher.FileDescriptorInfo; |
| 23 import org.chromium.base.process_launcher.ManagedChildProcessConnection; |
| 20 import org.chromium.content.app.ChromiumLinkerParams; | 24 import org.chromium.content.app.ChromiumLinkerParams; |
| 21 import org.chromium.content.common.ContentSwitches; | 25 import org.chromium.content.common.ContentSwitches; |
| 22 | 26 |
| 23 import java.util.Map; | 27 import java.util.Map; |
| 24 import java.util.concurrent.ConcurrentHashMap; | 28 import java.util.concurrent.ConcurrentHashMap; |
| 25 | 29 |
| 26 /** | 30 /** |
| 27 * This class provides the method to start/stop ChildProcess called by native. | 31 * This class provides the method to start/stop ChildProcess called by native. |
| 28 * | 32 * |
| 29 * Note about threading. The threading here is complicated and not well document
ed. | 33 * Note about threading. The threading here is complicated and not well document
ed. |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 linker.getImplementationForTesting()
); | 97 linker.getImplementationForTesting()
); |
| 94 } else { | 98 } else { |
| 95 return new ChromiumLinkerParams(sLinkerLoadAddress, | 99 return new ChromiumLinkerParams(sLinkerLoadAddress, |
| 96 waitForSharedRelros); | 100 waitForSharedRelros); |
| 97 } | 101 } |
| 98 } | 102 } |
| 99 | 103 |
| 100 @VisibleForTesting | 104 @VisibleForTesting |
| 101 static Bundle createCommonParamsBundle(ChildProcessCreationParams params) { | 105 static Bundle createCommonParamsBundle(ChildProcessCreationParams params) { |
| 102 Bundle commonParams = new Bundle(); | 106 Bundle commonParams = new Bundle(); |
| 103 commonParams.putParcelable( | 107 commonParams.putParcelable(ContentChildProcessConstants.EXTRA_LINKER_PAR
AMS, |
| 104 ChildProcessConstants.EXTRA_LINKER_PARAMS, getLinkerParamsForNew
Connection()); | 108 getLinkerParamsForNewConnection()); |
| 105 final boolean bindToCallerCheck = params == null ? false : params.getBin
dToCallerCheck(); | 109 final boolean bindToCallerCheck = params == null ? false : params.getBin
dToCallerCheck(); |
| 106 commonParams.putBoolean(ChildProcessConstants.EXTRA_BIND_TO_CALLER, bind
ToCallerCheck); | 110 commonParams.putBoolean( |
| 111 ContentChildProcessConstants.EXTRA_BIND_TO_CALLER, bindToCallerC
heck); |
| 107 return commonParams; | 112 return commonParams; |
| 108 } | 113 } |
| 109 | 114 |
| 110 @VisibleForTesting | 115 @VisibleForTesting |
| 111 static BaseChildProcessConnection allocateBoundConnection(ChildSpawnData spa
wnData, | 116 static BaseChildProcessConnection allocateBoundConnection(ChildSpawnData spa
wnData, |
| 112 BaseChildProcessConnection.StartCallback startCallback, boolean forW
armUp) { | 117 BaseChildProcessConnection.StartCallback startCallback, boolean forW
armUp) { |
| 113 assert LauncherThread.runningOnLauncherThread(); | 118 assert LauncherThread.runningOnLauncherThread(); |
| 114 final Context context = spawnData.getContext(); | 119 final Context context = spawnData.getContext(); |
| 115 final boolean inSandbox = spawnData.isInSandbox(); | 120 final boolean inSandbox = spawnData.isInSandbox(); |
| 116 final ChildProcessCreationParams creationParams = spawnData.getCreationP
arams(); | 121 final ChildProcessCreationParams creationParams = spawnData.getCreationP
arams(); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 private static BindingManager sBindingManager; | 205 private static BindingManager sBindingManager; |
| 201 | 206 |
| 202 // Whether the main application is currently brought to the foreground. | 207 // Whether the main application is currently brought to the foreground. |
| 203 private static boolean sApplicationInForeground = true; | 208 private static boolean sApplicationInForeground = true; |
| 204 | 209 |
| 205 // Lazy initialize sBindingManager | 210 // Lazy initialize sBindingManager |
| 206 // TODO(boliu): This should be internal to content. | 211 // TODO(boliu): This should be internal to content. |
| 207 public static BindingManager getBindingManager() { | 212 public static BindingManager getBindingManager() { |
| 208 synchronized (sBindingManagerLock) { | 213 synchronized (sBindingManagerLock) { |
| 209 if (sBindingManager == null) { | 214 if (sBindingManager == null) { |
| 210 sBindingManager = BindingManagerImpl.createBindingManager(); | 215 sBindingManager = |
| 216 BindingManagerImpl.createBindingManager(LauncherThread.g
etHandler()); |
| 211 } | 217 } |
| 212 return sBindingManager; | 218 return sBindingManager; |
| 213 } | 219 } |
| 214 } | 220 } |
| 215 | 221 |
| 216 @VisibleForTesting | 222 @VisibleForTesting |
| 217 public static void setBindingManagerForTesting(BindingManager manager) { | 223 public static void setBindingManagerForTesting(BindingManager manager) { |
| 218 sBindingManager = manager; | 224 sBindingManager = manager; |
| 219 } | 225 } |
| 220 | 226 |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 } | 468 } |
| 463 | 469 |
| 464 triggerConnectionSetup(allocatedConnection, commandLine, childProces
sId, | 470 triggerConnectionSetup(allocatedConnection, commandLine, childProces
sId, |
| 465 filesToBeMapped, childProcessCallback, launchCallback); | 471 filesToBeMapped, childProcessCallback, launchCallback); |
| 466 return allocatedConnection; | 472 return allocatedConnection; |
| 467 } finally { | 473 } finally { |
| 468 TraceEvent.end("ChildProcessLauncher.startInternal"); | 474 TraceEvent.end("ChildProcessLauncher.startInternal"); |
| 469 } | 475 } |
| 470 } | 476 } |
| 471 | 477 |
| 472 /** | |
| 473 * Create the common bundle to be passed to child processes. | |
| 474 * @param context Application context. | |
| 475 * @param commandLine Command line params to be passed to the service. | |
| 476 * @param linkerParams Linker params to start the service. | |
| 477 */ | |
| 478 protected static Bundle createsServiceBundle( | |
| 479 String[] commandLine, FileDescriptorInfo[] filesToBeMapped) { | |
| 480 Bundle bundle = new Bundle(); | |
| 481 bundle.putStringArray(ChildProcessConstants.EXTRA_COMMAND_LINE, commandL
ine); | |
| 482 bundle.putParcelableArray(ChildProcessConstants.EXTRA_FILES, filesToBeMa
pped); | |
| 483 bundle.putInt(ChildProcessConstants.EXTRA_CPU_COUNT, CpuFeatures.getCoun
t()); | |
| 484 bundle.putLong(ChildProcessConstants.EXTRA_CPU_FEATURES, CpuFeatures.get
Mask()); | |
| 485 bundle.putBundle(Linker.EXTRA_LINKER_SHARED_RELROS, Linker.getInstance()
.getSharedRelros()); | |
| 486 return bundle; | |
| 487 } | |
| 488 | |
| 489 @VisibleForTesting | 478 @VisibleForTesting |
| 490 static void triggerConnectionSetup(final BaseChildProcessConnection connecti
on, | 479 static void triggerConnectionSetup(final BaseChildProcessConnection connecti
on, |
| 491 String[] commandLine, int childProcessId, FileDescriptorInfo[] files
ToBeMapped, | 480 String[] commandLine, int childProcessId, FileDescriptorInfo[] files
ToBeMapped, |
| 492 final IBinder childProcessCallback, final LaunchCallback launchCallb
ack) { | 481 final IBinder childProcessCallback, final LaunchCallback launchCallb
ack) { |
| 493 assert LauncherThread.runningOnLauncherThread(); | 482 assert LauncherThread.runningOnLauncherThread(); |
| 494 Log.d(TAG, "Setting up connection to process: slot=%d", connection.getSe
rviceNumber()); | 483 Log.d(TAG, "Setting up connection to process: slot=%d", connection.getSe
rviceNumber()); |
| 495 BaseChildProcessConnection.ConnectionCallback connectionCallback = | 484 BaseChildProcessConnection.ConnectionCallback connectionCallback = |
| 496 new BaseChildProcessConnection.ConnectionCallback() { | 485 new BaseChildProcessConnection.ConnectionCallback() { |
| 497 @Override | 486 @Override |
| 487 public void onConnectionSetup(Bundle params) { |
| 488 params.putInt(ContentChildProcessConstants.EXTRA_CPU_COU
NT, |
| 489 CpuFeatures.getCount()); |
| 490 params.putLong(ContentChildProcessConstants.EXTRA_CPU_FE
ATURES, |
| 491 CpuFeatures.getMask()); |
| 492 params.putBundle(Linker.EXTRA_LINKER_SHARED_RELROS, |
| 493 Linker.getInstance().getSharedRelros()); |
| 494 } |
| 495 |
| 496 @Override |
| 498 public void onConnected(BaseChildProcessConnection connectio
n) { | 497 public void onConnected(BaseChildProcessConnection connectio
n) { |
| 499 assert LauncherThread.runningOnLauncherThread(); | 498 assert LauncherThread.runningOnLauncherThread(); |
| 500 if (connection != null) { | 499 if (connection != null) { |
| 501 int pid = connection.getPid(); | 500 int pid = connection.getPid(); |
| 502 Log.d(TAG, "on connect callback, pid=%d", pid); | 501 Log.d(TAG, "on connect callback, pid=%d", pid); |
| 503 if (connection instanceof ManagedChildProcessConnect
ion) { | 502 if (connection instanceof ManagedChildProcessConnect
ion) { |
| 504 getBindingManager().addNewConnection( | 503 getBindingManager().addNewConnection( |
| 505 pid, (ManagedChildProcessConnection) con
nection); | 504 pid, (ManagedChildProcessConnection) con
nection); |
| 506 } | 505 } |
| 507 sServiceMap.put(pid, connection); | 506 sServiceMap.put(pid, connection); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 | 552 |
| 554 try { | 553 try { |
| 555 ((ManagedChildProcessConnection) sServiceMap.get(pid)).crashServiceF
orTesting(); | 554 ((ManagedChildProcessConnection) sServiceMap.get(pid)).crashServiceF
orTesting(); |
| 556 } catch (RemoteException ex) { | 555 } catch (RemoteException ex) { |
| 557 return false; | 556 return false; |
| 558 } | 557 } |
| 559 | 558 |
| 560 return true; | 559 return true; |
| 561 } | 560 } |
| 562 } | 561 } |
| OLD | NEW |