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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 @SuppressWarnings("SynchronizeOnNonFinalField") | 52 @SuppressWarnings("SynchronizeOnNonFinalField") |
53 @MainDex | 53 @MainDex |
54 @UsedByReflection("WebApkSandboxedProcessService") | 54 @UsedByReflection("WebApkSandboxedProcessService") |
55 public class ChildProcessServiceImpl { | 55 public class ChildProcessServiceImpl { |
56 private static final String MAIN_THREAD_NAME = "ChildProcessMain"; | 56 private static final String MAIN_THREAD_NAME = "ChildProcessMain"; |
57 private static final String TAG = "ChildProcessService"; | 57 private static final String TAG = "ChildProcessService"; |
58 | 58 |
59 // Lock that protects the following members. | 59 // Lock that protects the following members. |
60 private final Object mBinderLock = new Object(); | 60 private final Object mBinderLock = new Object(); |
61 private IGpuProcessCallback mGpuCallback; | 61 private IGpuProcessCallback mGpuCallback; |
62 // PID of the client of this service, set in bindToCaller(). | 62 private boolean mBindToCallerCheck; |
| 63 // PID of the client of this service, set in bindToCaller(), if mBindToCalle
rCheck is true. |
63 private int mBoundCallingPid; | 64 private int mBoundCallingPid; |
64 | 65 |
65 // This is the native "Main" thread for the renderer / utility process. | 66 // This is the native "Main" thread for the renderer / utility process. |
66 private Thread mMainThread; | 67 private Thread mMainThread; |
67 // Parameters received via IPC, only accessed while holding the mMainThread
monitor. | 68 // Parameters received via IPC, only accessed while holding the mMainThread
monitor. |
68 private String[] mCommandLineParams; | 69 private String[] mCommandLineParams; |
69 private int mCpuCount; | 70 private int mCpuCount; |
70 private long mCpuFeatures; | 71 private long mCpuFeatures; |
71 // File descriptors that should be registered natively. | 72 // File descriptors that should be registered natively. |
72 private FileDescriptorInfo[] mFdInfos; | 73 private FileDescriptorInfo[] mFdInfos; |
(...skipping 30 matching lines...) Expand all Loading... |
103 mLinkerParams.mTestRunnerClassNameForTesting); | 104 mLinkerParams.mTestRunnerClassNameForTesting); |
104 } | 105 } |
105 return Linker.getInstance(); | 106 return Linker.getInstance(); |
106 } | 107 } |
107 | 108 |
108 // Binder object used by clients for this service. | 109 // Binder object used by clients for this service. |
109 private final IChildProcessService.Stub mBinder = new IChildProcessService.S
tub() { | 110 private final IChildProcessService.Stub mBinder = new IChildProcessService.S
tub() { |
110 // NOTE: Implement any IChildProcessService methods here. | 111 // NOTE: Implement any IChildProcessService methods here. |
111 @Override | 112 @Override |
112 public boolean bindToCaller() { | 113 public boolean bindToCaller() { |
| 114 assert mBindToCallerCheck; |
113 synchronized (mBinderLock) { | 115 synchronized (mBinderLock) { |
114 int callingPid = Binder.getCallingPid(); | 116 int callingPid = Binder.getCallingPid(); |
115 if (mBoundCallingPid == 0) { | 117 if (mBoundCallingPid == 0) { |
116 mBoundCallingPid = callingPid; | 118 mBoundCallingPid = callingPid; |
117 } else if (mBoundCallingPid != callingPid) { | 119 } else if (mBoundCallingPid != callingPid) { |
118 Log.e(TAG, "Service is already bound by pid %d, cannot bind
for pid %d", | 120 Log.e(TAG, "Service is already bound by pid %d, cannot bind
for pid %d", |
119 mBoundCallingPid, callingPid); | 121 mBoundCallingPid, callingPid); |
120 return false; | 122 return false; |
121 } | 123 } |
122 } | 124 } |
123 return true; | 125 return true; |
124 } | 126 } |
125 | 127 |
126 @Override | 128 @Override |
127 public int setupConnection(Bundle args, IBinder callback) { | 129 public int setupConnection(Bundle args, IBinder callback) { |
128 int callingPid = Binder.getCallingPid(); | 130 int callingPid = Binder.getCallingPid(); |
129 synchronized (mBinderLock) { | 131 synchronized (mBinderLock) { |
130 if (mBoundCallingPid != callingPid) { | 132 if (mBindToCallerCheck && mBoundCallingPid != callingPid) { |
131 if (mBoundCallingPid == 0) { | 133 if (mBoundCallingPid == 0) { |
132 Log.e(TAG, "Service has not been bound with bindToCaller
()"); | 134 Log.e(TAG, "Service has not been bound with bindToCaller
()"); |
133 } else { | 135 } else { |
134 Log.e(TAG, "Client pid %d does not match the bound pid %
d", callingPid, | 136 Log.e(TAG, "Client pid %d does not match the bound pid %
d", callingPid, |
135 mBoundCallingPid); | 137 mBoundCallingPid); |
136 } | 138 } |
137 return -1; | 139 return -1; |
138 } | 140 } |
| 141 } |
139 | 142 |
140 mGpuCallback = | 143 mGpuCallback = callback != null ? IGpuProcessCallback.Stub.asInterfa
ce(callback) : null; |
141 callback != null ? IGpuProcessCallback.Stub.asInterface(
callback) : null; | 144 getServiceInfo(args); |
142 getServiceInfo(args); | 145 return Process.myPid(); |
143 return Process.myPid(); | |
144 } | |
145 } | 146 } |
146 | 147 |
147 @Override | 148 @Override |
148 public void crashIntentionallyForTesting() { | 149 public void crashIntentionallyForTesting() { |
149 Process.killProcess(Process.myPid()); | 150 Process.killProcess(Process.myPid()); |
150 } | 151 } |
151 | 152 |
152 @Override | 153 @Override |
153 public boolean onTransact(int arg0, Parcel arg1, Parcel arg2, int arg3) | 154 public boolean onTransact(int arg0, Parcel arg1, Parcel arg2, int arg3) |
154 throws RemoteException { | 155 throws RemoteException { |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 | 335 |
335 private void initializeParams(Intent intent) { | 336 private void initializeParams(Intent intent) { |
336 synchronized (mMainThread) { | 337 synchronized (mMainThread) { |
337 // mLinkerParams is never used if Linker.isUsed() returns false. | 338 // mLinkerParams is never used if Linker.isUsed() returns false. |
338 // See onCreate(). | 339 // See onCreate(). |
339 mLinkerParams = (ChromiumLinkerParams) intent.getParcelableExtra( | 340 mLinkerParams = (ChromiumLinkerParams) intent.getParcelableExtra( |
340 ChildProcessConstants.EXTRA_LINKER_PARAMS); | 341 ChildProcessConstants.EXTRA_LINKER_PARAMS); |
341 mLibraryProcessType = ChildProcessCreationParams.getLibraryProcessTy
pe(intent); | 342 mLibraryProcessType = ChildProcessCreationParams.getLibraryProcessTy
pe(intent); |
342 mMainThread.notifyAll(); | 343 mMainThread.notifyAll(); |
343 } | 344 } |
| 345 synchronized (mBinderLock) { |
| 346 mBindToCallerCheck = |
| 347 intent.getBooleanExtra(ChildProcessConstants.EXTRA_BIND_TO_C
ALLER, false); |
| 348 } |
344 } | 349 } |
345 | 350 |
346 private void getServiceInfo(Bundle bundle) { | 351 private void getServiceInfo(Bundle bundle) { |
347 // Required to unparcel FileDescriptorInfo. | 352 // Required to unparcel FileDescriptorInfo. |
348 bundle.setClassLoader(mHostClassLoader); | 353 bundle.setClassLoader(mHostClassLoader); |
349 synchronized (mMainThread) { | 354 synchronized (mMainThread) { |
350 if (mCommandLineParams == null) { | 355 if (mCommandLineParams == null) { |
351 mCommandLineParams = | 356 mCommandLineParams = |
352 bundle.getStringArray(ChildProcessConstants.EXTRA_COMMAN
D_LINE); | 357 bundle.getStringArray(ChildProcessConstants.EXTRA_COMMAN
D_LINE); |
353 mMainThread.notifyAll(); | 358 mMainThread.notifyAll(); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 private static native void nativeInitChildProcessImpl( | 436 private static native void nativeInitChildProcessImpl( |
432 ChildProcessServiceImpl serviceImpl, int cpuCount, long cpuFeatures)
; | 437 ChildProcessServiceImpl serviceImpl, int cpuCount, long cpuFeatures)
; |
433 | 438 |
434 /** | 439 /** |
435 * Force the child process to exit. | 440 * Force the child process to exit. |
436 */ | 441 */ |
437 private static native void nativeExitChildProcess(); | 442 private static native void nativeExitChildProcess(); |
438 | 443 |
439 private native void nativeShutdownMainThread(); | 444 private native void nativeShutdownMainThread(); |
440 } | 445 } |
OLD | NEW |