Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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.app; | 5 package org.chromium.content.app; |
| 6 | 6 |
| 7 import android.app.Service; | 7 import android.app.Service; |
| 8 import android.content.Context; | 8 import android.content.Context; |
| 9 import android.content.Intent; | 9 import android.content.Intent; |
| 10 import android.graphics.SurfaceTexture; | 10 import android.graphics.SurfaceTexture; |
| 11 import android.os.Bundle; | 11 import android.os.Bundle; |
| 12 import android.os.IBinder; | 12 import android.os.IBinder; |
| 13 import android.os.ParcelFileDescriptor; | 13 import android.os.ParcelFileDescriptor; |
| 14 import android.os.Process; | 14 import android.os.Process; |
| 15 import android.os.RemoteException; | 15 import android.os.RemoteException; |
| 16 import android.util.Log; | 16 import android.util.Log; |
| 17 import android.view.Surface; | 17 import android.view.Surface; |
| 18 | 18 |
| 19 import org.chromium.base.CalledByNative; | 19 import org.chromium.base.CalledByNative; |
| 20 import org.chromium.base.JNINamespace; | 20 import org.chromium.base.JNINamespace; |
| 21 import org.chromium.content.browser.ChildProcessConnection; | 21 import org.chromium.content.browser.ChildProcessConnection; |
| 22 import org.chromium.content.common.IChildProcessCallback; | 22 import org.chromium.content.common.IChildProcessCallback; |
| 23 import org.chromium.content.common.IChildProcessService; | 23 import org.chromium.content.common.IChildProcessService; |
| 24 import org.chromium.content.browser.ChildProcessLauncher; | |
| 25 import org.chromium.content.common.ProcessInitException; | 24 import org.chromium.content.common.ProcessInitException; |
| 26 | 25 |
| 27 import java.util.ArrayList; | 26 import java.util.ArrayList; |
| 28 import java.util.concurrent.atomic.AtomicReference; | 27 import java.util.concurrent.atomic.AtomicReference; |
| 29 | 28 |
| 30 /** | 29 /** |
| 31 * This is the base class for child services; the [Non]SandboxedProcessService0, 1.. etc | 30 * This is the base class for child services; the [Non]SandboxedProcessService0, 1.. etc |
| 32 * subclasses provide the concrete service entry points, to enable the browser t o connect | 31 * subclasses provide the concrete service entry points, to enable the browser t o connect |
| 33 * to more than one distinct process (i.e. one process per service number, up to limit of N). | 32 * to more than one distinct process (i.e. one process per service number, up to limit of N). |
| 34 * The embedding application must declare these service instances in the applica tion section | 33 * The embedding application must declare these service instances in the applica tion section |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 45 | 44 |
| 46 // This is the native "Main" thread for the renderer / utility process. | 45 // This is the native "Main" thread for the renderer / utility process. |
| 47 private Thread mMainThread; | 46 private Thread mMainThread; |
| 48 // Parameters received via IPC, only accessed while holding the mMainThread monitor. | 47 // Parameters received via IPC, only accessed while holding the mMainThread monitor. |
| 49 private String[] mCommandLineParams; | 48 private String[] mCommandLineParams; |
| 50 private int mCpuCount; | 49 private int mCpuCount; |
| 51 private long mCpuFeatures; | 50 private long mCpuFeatures; |
| 52 // Pairs IDs and file descriptors that should be registered natively. | 51 // Pairs IDs and file descriptors that should be registered natively. |
| 53 private ArrayList<Integer> mFileIds; | 52 private ArrayList<Integer> mFileIds; |
| 54 private ArrayList<ParcelFileDescriptor> mFileFds; | 53 private ArrayList<ParcelFileDescriptor> mFileFds; |
| 54 // Linker-specific parameters for this child process service. | |
| 55 private LinkerParams mLinkerParams; | |
| 55 | 56 |
| 56 private static AtomicReference<Context> sContext = new AtomicReference<Conte xt>(null); | 57 private static AtomicReference<Context> sContext = new AtomicReference<Conte xt>(null); |
| 57 private boolean mLibraryInitialized = false; | 58 private boolean mLibraryInitialized = false; |
| 59 // Becomes true once the service is bound. | |
| 60 private boolean mIsBound = false; | |
| 58 | 61 |
| 59 // Binder object used by clients for this service. | 62 // Binder object used by clients for this service. |
| 60 private final IChildProcessService.Stub mBinder = new IChildProcessService.S tub() { | 63 private final IChildProcessService.Stub mBinder = new IChildProcessService.S tub() { |
| 61 // NOTE: Implement any IChildProcessService methods here. | 64 // NOTE: Implement any IChildProcessService methods here. |
| 62 @Override | 65 @Override |
| 63 public int setupConnection(Bundle args, IChildProcessCallback callback) { | 66 public int setupConnection(Bundle args, IChildProcessCallback callback) { |
| 64 mCallback = callback; | 67 mCallback = callback; |
| 65 synchronized (mMainThread) { | 68 synchronized (mMainThread) { |
| 66 // Allow the command line to be set via bind() intent or setupCo nnection, but | 69 // Allow the command line to be set via bind() intent or setupCo nnection, but |
| 67 // the FD can only be transferred here. | 70 // the FD can only be transferred here. |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 82 ParcelFileDescriptor parcel = args.getParcelable(fdName); | 85 ParcelFileDescriptor parcel = args.getParcelable(fdName); |
| 83 if (parcel == null) { | 86 if (parcel == null) { |
| 84 // End of the file list. | 87 // End of the file list. |
| 85 break; | 88 break; |
| 86 } | 89 } |
| 87 mFileFds.add(parcel); | 90 mFileFds.add(parcel); |
| 88 String idName = ChildProcessConnection.EXTRA_FILES_PREFIX + i | 91 String idName = ChildProcessConnection.EXTRA_FILES_PREFIX + i |
| 89 + ChildProcessConnection.EXTRA_FILES_ID_SUFFIX; | 92 + ChildProcessConnection.EXTRA_FILES_ID_SUFFIX; |
| 90 mFileIds.add(args.getInt(idName)); | 93 mFileIds.add(args.getInt(idName)); |
| 91 } | 94 } |
| 95 Bundle sharedRelros = args.getBundle(Linker.EXTRA_LINKER_SHARED_ RELROS); | |
| 96 if (sharedRelros != null) { | |
| 97 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
| |
| 98 sharedRelros = null; | |
| 99 } | |
| 92 mMainThread.notifyAll(); | 100 mMainThread.notifyAll(); |
| 93 } | 101 } |
| 94 return Process.myPid(); | 102 return Process.myPid(); |
| 95 } | 103 } |
| 96 }; | 104 }; |
| 97 | 105 |
| 98 /* package */ static Context getContext() { | 106 /* package */ static Context getContext() { |
| 99 return sContext.get(); | 107 return sContext.get(); |
| 100 } | 108 } |
| 101 | 109 |
| 102 @Override | 110 @Override |
| 103 public void onCreate() { | 111 public void onCreate() { |
| 104 Log.i(TAG, "Creating new ChildProcessService pid=" + Process.myPid()); | 112 Log.i(TAG, "Creating new ChildProcessService pid=" + Process.myPid()); |
| 105 if (sContext.get() != null) { | 113 if (sContext.get() != null) { |
| 106 Log.e(TAG, "ChildProcessService created again in process!"); | 114 Log.e(TAG, "ChildProcessService created again in process!"); |
| 107 } | 115 } |
| 108 sContext.set(this); | 116 sContext.set(this); |
| 109 super.onCreate(); | 117 super.onCreate(); |
| 110 | 118 |
| 111 mMainThread = new Thread(new Runnable() { | 119 mMainThread = new Thread(new Runnable() { |
| 112 @Override | 120 @Override |
| 113 public void run() { | 121 public void run() { |
| 114 try { | 122 try { |
| 123 boolean useLinker = Linker.isUsed(); | |
| 124 | |
| 125 if (useLinker) { | |
| 126 synchronized (mMainThread) { | |
| 127 while (!mIsBound) | |
| 128 mMainThread.wait(); | |
| 129 } | |
| 130 if (mLinkerParams != null && mLinkerParams.mWaitForShare dRelro) | |
| 131 Linker.initServiceProcess(mLinkerParams.mBaseLoadAdd ress); | |
| 132 else | |
| 133 Linker.disableSharedRelros(); | |
| 134 } | |
| 115 try { | 135 try { |
| 116 LibraryLoader.loadNow(); | 136 LibraryLoader.loadNow(); |
| 117 } catch (ProcessInitException e) { | 137 } catch (ProcessInitException e) { |
| 118 Log.e(TAG, "Failed to load native library, exiting child process", e); | 138 Log.e(TAG, "Failed to load native library, exiting child process", e); |
| 119 return; | 139 return; |
| 120 } | 140 } |
| 121 synchronized (mMainThread) { | 141 synchronized (mMainThread) { |
| 122 while (mCommandLineParams == null) { | 142 while (mCommandLineParams == null) { |
| 123 mMainThread.wait(); | 143 mMainThread.wait(); |
| 124 } | 144 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 181 public IBinder onBind(Intent intent) { | 201 public IBinder onBind(Intent intent) { |
| 182 // We call stopSelf() to request that this service be stopped as soon as the client | 202 // We call stopSelf() to request that this service be stopped as soon as the client |
| 183 // unbinds. Otherwise the system may keep it around and available for a reconnect. The | 203 // unbinds. Otherwise the system may keep it around and available for a reconnect. The |
| 184 // child processes do not currently support reconnect; they must be init ialized from | 204 // child processes do not currently support reconnect; they must be init ialized from |
| 185 // scratch every time. | 205 // scratch every time. |
| 186 stopSelf(); | 206 stopSelf(); |
| 187 | 207 |
| 188 synchronized (mMainThread) { | 208 synchronized (mMainThread) { |
| 189 mCommandLineParams = intent.getStringArrayExtra( | 209 mCommandLineParams = intent.getStringArrayExtra( |
| 190 ChildProcessConnection.EXTRA_COMMAND_LINE); | 210 ChildProcessConnection.EXTRA_COMMAND_LINE); |
| 211 mLinkerParams = null; | |
| 212 if (Linker.isUsed()) | |
| 213 mLinkerParams = new LinkerParams(intent); | |
| 214 mIsBound = true; | |
| 191 mMainThread.notifyAll(); | 215 mMainThread.notifyAll(); |
| 192 } | 216 } |
| 193 | 217 |
| 194 return mBinder; | 218 return mBinder; |
| 195 } | 219 } |
| 196 | 220 |
| 197 /** | 221 /** |
| 198 * Called from native code to share a surface texture with another child pro cess. | 222 * Called from native code to share a surface texture with another child pro cess. |
| 199 * Through using the callback object the browser is used as a proxy to route the | 223 * Through using the callback object the browser is used as a proxy to route the |
| 200 * call to the correct process. | 224 * call to the correct process. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 ChildProcessService service, int[] extraFileIds, int[] extraFileFds, | 290 ChildProcessService service, int[] extraFileIds, int[] extraFileFds, |
| 267 int cpuCount, long cpuFeatures); | 291 int cpuCount, long cpuFeatures); |
| 268 | 292 |
| 269 /** | 293 /** |
| 270 * Force the child process to exit. | 294 * Force the child process to exit. |
| 271 */ | 295 */ |
| 272 private static native void nativeExitChildProcess(); | 296 private static native void nativeExitChildProcess(); |
| 273 | 297 |
| 274 private native void nativeShutdownMainThread(); | 298 private native void nativeShutdownMainThread(); |
| 275 } | 299 } |
| OLD | NEW |