| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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.content.Context; | 7 import android.content.Context; |
| 8 import android.content.Intent; | 8 import android.content.Intent; |
| 9 import android.graphics.SurfaceTexture; | 9 import android.graphics.SurfaceTexture; |
| 10 import android.os.Binder; | 10 import android.os.Binder; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 private long mCpuFeatures; | 63 private long mCpuFeatures; |
| 64 // File descriptors that should be registered natively. | 64 // File descriptors that should be registered natively. |
| 65 private FileDescriptorInfo[] mFdInfos; | 65 private FileDescriptorInfo[] mFdInfos; |
| 66 // Linker-specific parameters for this child process service. | 66 // Linker-specific parameters for this child process service. |
| 67 private ChromiumLinkerParams mLinkerParams; | 67 private ChromiumLinkerParams mLinkerParams; |
| 68 // Child library process type. | 68 // Child library process type. |
| 69 private int mLibraryProcessType; | 69 private int mLibraryProcessType; |
| 70 | 70 |
| 71 private static AtomicReference<Context> sContext = new AtomicReference<>(nul
l); | 71 private static AtomicReference<Context> sContext = new AtomicReference<>(nul
l); |
| 72 private boolean mLibraryInitialized = false; | 72 private boolean mLibraryInitialized = false; |
| 73 // Becomes true once the service is bound. Access must synchronize around mM
ainThread. | |
| 74 private boolean mIsBound = false; | |
| 75 | 73 |
| 76 /** | 74 /** |
| 77 * If >= 0 enables "validation of caller of {@link mBinder}'s methods". A Re
moteException | 75 * If >= 0 enables "validation of caller of {@link mBinder}'s methods". A Re
moteException |
| 78 * is thrown when an application with a uid other than {@link mAuthorizedCal
lerUid} calls | 76 * is thrown when an application with a uid other than {@link mAuthorizedCal
lerUid} calls |
| 79 * {@link mBinder}'s methods. | 77 * {@link mBinder}'s methods. |
| 80 */ | 78 */ |
| 81 private int mAuthorizedCallerUid; | 79 private int mAuthorizedCallerUid; |
| 82 | 80 |
| 83 private final Semaphore mActivitySemaphore = new Semaphore(1); | 81 private final Semaphore mActivitySemaphore = new Semaphore(1); |
| 84 | 82 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 synchronized (mMainThread) { | 155 synchronized (mMainThread) { |
| 158 while (mCommandLineParams == null) { | 156 while (mCommandLineParams == null) { |
| 159 mMainThread.wait(); | 157 mMainThread.wait(); |
| 160 } | 158 } |
| 161 } | 159 } |
| 162 CommandLine.init(mCommandLineParams); | 160 CommandLine.init(mCommandLineParams); |
| 163 | 161 |
| 164 Linker linker = null; | 162 Linker linker = null; |
| 165 boolean requestedSharedRelro = false; | 163 boolean requestedSharedRelro = false; |
| 166 if (Linker.isUsed()) { | 164 if (Linker.isUsed()) { |
| 167 synchronized (mMainThread) { | 165 assert mLinkerParams != null; |
| 168 while (!mIsBound) { | |
| 169 mMainThread.wait(); | |
| 170 } | |
| 171 } | |
| 172 linker = getLinker(); | 166 linker = getLinker(); |
| 173 if (mLinkerParams.mWaitForSharedRelro) { | 167 if (mLinkerParams.mWaitForSharedRelro) { |
| 174 requestedSharedRelro = true; | 168 requestedSharedRelro = true; |
| 175 linker.initServiceProcess(mLinkerParams.mBaseLoadAdd
ress); | 169 linker.initServiceProcess(mLinkerParams.mBaseLoadAdd
ress); |
| 176 } else { | 170 } else { |
| 177 linker.disableSharedRelros(); | 171 linker.disableSharedRelros(); |
| 178 } | 172 } |
| 179 } | 173 } |
| 180 boolean isLoaded = false; | 174 boolean isLoaded = false; |
| 181 if (CommandLine.getInstance().hasSwitch( | 175 if (CommandLine.getInstance().hasSwitch( |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 * is thrown when an application with a uid other than | 269 * is thrown when an application with a uid other than |
| 276 * {@link authorizedCallerUid} calls the service's methods. | 270 * {@link authorizedCallerUid} calls the service's methods. |
| 277 */ | 271 */ |
| 278 @UsedByReflection("WebApkSandboxedProcessService") | 272 @UsedByReflection("WebApkSandboxedProcessService") |
| 279 public IBinder bind(Intent intent, int authorizedCallerUid) { | 273 public IBinder bind(Intent intent, int authorizedCallerUid) { |
| 280 mAuthorizedCallerUid = authorizedCallerUid; | 274 mAuthorizedCallerUid = authorizedCallerUid; |
| 281 initializeParams(intent); | 275 initializeParams(intent); |
| 282 return mBinder; | 276 return mBinder; |
| 283 } | 277 } |
| 284 | 278 |
| 285 void initializeParams(Intent intent) { | 279 private void initializeParams(Intent intent) { |
| 286 synchronized (mMainThread) { | 280 synchronized (mMainThread) { |
| 287 mCommandLineParams = | |
| 288 intent.getStringArrayExtra(ChildProcessConstants.EXTRA_COMMA
ND_LINE); | |
| 289 // mLinkerParams is never used if Linker.isUsed() returns false. | 281 // mLinkerParams is never used if Linker.isUsed() returns false. |
| 290 // See onCreate(). | 282 // See onCreate(). |
| 291 mLinkerParams = new ChromiumLinkerParams(intent); | 283 mLinkerParams = new ChromiumLinkerParams(intent); |
| 292 mLibraryProcessType = ChildProcessCreationParams.getLibraryProcessTy
pe(intent); | 284 mLibraryProcessType = ChildProcessCreationParams.getLibraryProcessTy
pe(intent); |
| 293 mIsBound = true; | |
| 294 mMainThread.notifyAll(); | 285 mMainThread.notifyAll(); |
| 295 } | 286 } |
| 296 } | 287 } |
| 297 | 288 |
| 298 void getServiceInfo(Bundle bundle) { | 289 private void getServiceInfo(Bundle bundle) { |
| 299 // Required to unparcel FileDescriptorInfo. | 290 // Required to unparcel FileDescriptorInfo. |
| 300 bundle.setClassLoader(mHostClassLoader); | 291 bundle.setClassLoader(mHostClassLoader); |
| 301 synchronized (mMainThread) { | 292 synchronized (mMainThread) { |
| 302 // Allow the command line to be set via bind() intent or setupConnec
tion, but | |
| 303 // the FD can only be transferred here. | |
| 304 if (mCommandLineParams == null) { | 293 if (mCommandLineParams == null) { |
| 305 mCommandLineParams = | 294 mCommandLineParams = |
| 306 bundle.getStringArray(ChildProcessConstants.EXTRA_COMMAN
D_LINE); | 295 bundle.getStringArray(ChildProcessConstants.EXTRA_COMMAN
D_LINE); |
| 296 mMainThread.notifyAll(); |
| 307 } | 297 } |
| 308 // We must have received the command line by now | 298 // We must have received the command line by now |
| 309 assert mCommandLineParams != null; | 299 assert mCommandLineParams != null; |
| 310 mCpuCount = bundle.getInt(ChildProcessConstants.EXTRA_CPU_COUNT); | 300 mCpuCount = bundle.getInt(ChildProcessConstants.EXTRA_CPU_COUNT); |
| 311 mCpuFeatures = bundle.getLong(ChildProcessConstants.EXTRA_CPU_FEATUR
ES); | 301 mCpuFeatures = bundle.getLong(ChildProcessConstants.EXTRA_CPU_FEATUR
ES); |
| 312 assert mCpuCount > 0; | 302 assert mCpuCount > 0; |
| 313 Parcelable[] fdInfosAsParcelable = | 303 Parcelable[] fdInfosAsParcelable = |
| 314 bundle.getParcelableArray(ChildProcessConstants.EXTRA_FILES)
; | 304 bundle.getParcelableArray(ChildProcessConstants.EXTRA_FILES)
; |
| 315 if (fdInfosAsParcelable != null) { | 305 if (fdInfosAsParcelable != null) { |
| 316 // For why this arraycopy is necessary: | 306 // For why this arraycopy is necessary: |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 private static native void nativeInitChildProcessImpl( | 415 private static native void nativeInitChildProcessImpl( |
| 426 ChildProcessServiceImpl serviceImpl, int cpuCount, long cpuFeatures)
; | 416 ChildProcessServiceImpl serviceImpl, int cpuCount, long cpuFeatures)
; |
| 427 | 417 |
| 428 /** | 418 /** |
| 429 * Force the child process to exit. | 419 * Force the child process to exit. |
| 430 */ | 420 */ |
| 431 private static native void nativeExitChildProcess(); | 421 private static native void nativeExitChildProcess(); |
| 432 | 422 |
| 433 private native void nativeShutdownMainThread(); | 423 private native void nativeShutdownMainThread(); |
| 434 } | 424 } |
| OLD | NEW |