Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(419)

Side by Side Diff: content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java

Issue 2828793002: Refactoring ChildProcessConnection. (Closed)
Patch Set: More test fixing. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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.ParcelFileDescriptor; 8 import android.os.ParcelFileDescriptor;
9 9
10 import org.chromium.base.ContextUtils; 10 import org.chromium.base.ContextUtils;
11 import org.chromium.base.Log; 11 import org.chromium.base.Log;
12 import org.chromium.base.annotations.CalledByNative; 12 import org.chromium.base.annotations.CalledByNative;
13 import org.chromium.base.annotations.JNINamespace; 13 import org.chromium.base.annotations.JNINamespace;
14 import org.chromium.base.process_launcher.ChildProcessCreationParams; 14 import org.chromium.base.process_launcher.ChildProcessCreationParams;
15 import org.chromium.base.process_launcher.FileDescriptorInfo; 15 import org.chromium.base.process_launcher.FileDescriptorInfo;
16 16
17 import java.io.IOException; 17 import java.io.IOException;
18 18
19 /** 19 /**
20 * This is the java counterpart to ChildProcessLauncherHelper. It is owned by na tive side and 20 * This is the java counterpart to ChildProcessLauncherHelper. It is owned by na tive side and
21 * has an explicit destroy method. 21 * has an explicit destroy method.
22 * Each public or jni methods should have explicit documentation on what threads they are called. 22 * Each public or jni methods should have explicit documentation on what threads they are called.
23 */ 23 */
24 @JNINamespace("content::internal") 24 @JNINamespace("content::internal")
25 class ChildProcessLauncherHelper { 25 class ChildProcessLauncherHelper {
26 private static final String TAG = "ChildProcLH"; 26 private static final String TAG = "ChildProcLH";
27 27
28 // Represents an invalid process handle; same as base/process/process.h kNul lProcessHandle.
29 private static final int NULL_PROCESS_HANDLE = 0;
30
28 // Note native pointer is only guaranteed live until nativeOnChildProcessSta rted. 31 // Note native pointer is only guaranteed live until nativeOnChildProcessSta rted.
29 private long mNativeChildProcessLauncherHelper; 32 private long mNativeChildProcessLauncherHelper;
30 private int mPid; 33 private BaseChildProcessConnection mChildProcessConnection;
31 34
32 @CalledByNative 35 @CalledByNative
33 private static FileDescriptorInfo makeFdInfo( 36 private static FileDescriptorInfo makeFdInfo(
34 int id, int fd, boolean autoClose, long offset, long size) { 37 int id, int fd, boolean autoClose, long offset, long size) {
35 assert LauncherThread.runningOnLauncherThread(); 38 assert LauncherThread.runningOnLauncherThread();
36 ParcelFileDescriptor pFd; 39 ParcelFileDescriptor pFd;
37 if (autoClose) { 40 if (autoClose) {
38 // Adopt the FD, it will be closed when we close the ParcelFileDescr iptor. 41 // Adopt the FD, it will be closed when we close the ParcelFileDescr iptor.
39 pFd = ParcelFileDescriptor.adoptFd(fd); 42 pFd = ParcelFileDescriptor.adoptFd(fd);
40 } else { 43 } else {
(...skipping 16 matching lines...) Expand all
57 } 60 }
58 61
59 private ChildProcessLauncherHelper(long nativePointer, int paramId, final St ring[] commandLine, 62 private ChildProcessLauncherHelper(long nativePointer, int paramId, final St ring[] commandLine,
60 int childProcessId, FileDescriptorInfo[] filesToBeMapped) { 63 int childProcessId, FileDescriptorInfo[] filesToBeMapped) {
61 assert LauncherThread.runningOnLauncherThread(); 64 assert LauncherThread.runningOnLauncherThread();
62 mNativeChildProcessLauncherHelper = nativePointer; 65 mNativeChildProcessLauncherHelper = nativePointer;
63 66
64 ChildProcessLauncher.start(ContextUtils.getApplicationContext(), paramId , commandLine, 67 ChildProcessLauncher.start(ContextUtils.getApplicationContext(), paramId , commandLine,
65 childProcessId, filesToBeMapped, new ChildProcessLauncher.Launch Callback() { 68 childProcessId, filesToBeMapped, new ChildProcessLauncher.Launch Callback() {
66 @Override 69 @Override
67 public void onChildProcessStarted(int pid) { 70 public void onChildProcessStarted(BaseChildProcessConnection connection) {
68 mPid = pid; 71 mChildProcessConnection = connection;
69 if (mNativeChildProcessLauncherHelper != 0) { 72 if (mNativeChildProcessLauncherHelper != 0) {
70 nativeOnChildProcessStarted(mNativeChildProcessLaunc herHelper, pid); 73 nativeOnChildProcessStarted(
74 mNativeChildProcessLauncherHelper, getPid()) ;
71 } 75 }
72 mNativeChildProcessLauncherHelper = 0; 76 mNativeChildProcessLauncherHelper = 0;
73 } 77 }
74 }); 78 });
75 } 79 }
76 80
81 private int getPid() {
82 return mChildProcessConnection == null ? NULL_PROCESS_HANDLE
83 : mChildProcessConnection.getPid( );
84 }
85
77 // Called on client (UI or IO) thread. 86 // Called on client (UI or IO) thread.
78 @CalledByNative 87 @CalledByNative
79 private boolean isOomProtected() { 88 private boolean isOomProtected() {
80 return ChildProcessLauncher.getBindingManager().isOomProtected(mPid); 89 // mChildProcessConnection is set on a different thread but does not cha nge once it's been
90 // set. So it is safe to test whether it's null from a different thread.
91 if (mChildProcessConnection == null) {
92 return false;
93 }
94
95 if (mChildProcessConnection instanceof ImportantChildProcessConnection) {
96 // The connection was bound as BIND_IMPORTANT. This should prevent i t from being killed
97 // when the app is on the foreground (that's our best guess, but the re is no absolute
98 // guarantee).
99 return ChildProcessLauncher.isApplicationInForeground();
100 }
101
102 return ((ManagedChildProcessConnection) mChildProcessConnection)
103 .isOomProtectedOrWasWhenDied();
81 } 104 }
82 105
83 @CalledByNative 106 @CalledByNative
84 private void setInForeground(int pid, boolean inForeground) { 107 private void setInForeground(int pid, boolean inForeground) {
85 assert LauncherThread.runningOnLauncherThread(); 108 assert LauncherThread.runningOnLauncherThread();
86 assert mPid == pid; 109 assert getPid() == pid;
87 ChildProcessLauncher.getBindingManager().setInForeground(mPid, inForegro und); 110 ChildProcessLauncher.getBindingManager().setInForeground(pid, inForegrou nd);
88 } 111 }
89 112
90 @CalledByNative 113 @CalledByNative
91 private static void stop(int pid) { 114 private static void stop(int pid) {
92 assert LauncherThread.runningOnLauncherThread(); 115 assert LauncherThread.runningOnLauncherThread();
93 ChildProcessLauncher.stop(pid); 116 ChildProcessLauncher.stop(pid);
94 } 117 }
95 118
96 // Called on UI thread. 119 // Called on UI thread.
97 @CalledByNative 120 @CalledByNative
98 private static int getNumberOfRendererSlots() { 121 private static int getNumberOfRendererSlots() {
99 final ChildProcessCreationParams params = ChildProcessCreationParams.get Default(); 122 final ChildProcessCreationParams params = ChildProcessCreationParams.get Default();
100 final Context context = ContextUtils.getApplicationContext(); 123 final Context context = ContextUtils.getApplicationContext();
101 final boolean inSandbox = true; 124 final boolean inSandbox = true;
102 final String packageName = 125 final String packageName =
103 params == null ? context.getPackageName() : params.getPackageNam e(); 126 params == null ? context.getPackageName() : params.getPackageNam e();
104 try { 127 try {
105 return ChildConnectionAllocator.getNumberOfServices(context, inSandb ox, packageName); 128 return ChildConnectionAllocator.getNumberOfServices(context, inSandb ox, packageName);
106 } catch (RuntimeException e) { 129 } catch (RuntimeException e) {
107 // Unittest packages do not declare services. Some tests require a r ealistic number 130 // Unittest packages do not declare services. Some tests require a r ealistic number
108 // to test child process policies, so pick a high-ish number here. 131 // to test child process policies, so pick a high-ish number here.
109 return 65535; 132 return 65535;
110 } 133 }
111 } 134 }
112 135
113 // Can be called on a number of threads, including launcher, and binder. 136 // Can be called on a number of threads, including launcher, and binder.
114 private static native void nativeOnChildProcessStarted( 137 private static native void nativeOnChildProcessStarted(
115 long nativeChildProcessLauncherHelper, int pid); 138 long nativeChildProcessLauncherHelper, int pid);
116 } 139 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698