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

Side by Side Diff: content/public/android/java/src/org/chromium/content/app/ChildProcessService.java

Issue 1314823003: Make Linker.isUsed() static, and clean up the fallout. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Tiny log tweak, protected->private, rebase to master. Created 5 years, 3 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 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.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;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 // Linker-specific parameters for this child process service. 62 // Linker-specific parameters for this child process service.
63 private ChromiumLinkerParams mLinkerParams; 63 private ChromiumLinkerParams mLinkerParams;
64 64
65 private static AtomicReference<Context> sContext = new AtomicReference<Conte xt>(null); 65 private static AtomicReference<Context> sContext = new AtomicReference<Conte xt>(null);
66 private boolean mLibraryInitialized = false; 66 private boolean mLibraryInitialized = false;
67 // Becomes true once the service is bound. Access must synchronize around mM ainThread. 67 // Becomes true once the service is bound. Access must synchronize around mM ainThread.
68 private boolean mIsBound = false; 68 private boolean mIsBound = false;
69 69
70 private final Semaphore mActivitySemaphore = new Semaphore(1); 70 private final Semaphore mActivitySemaphore = new Semaphore(1);
71 71
72 // Return a Linker instance. If testing, the Linker needs special setup.
73 private Linker getLinker() {
74 if (Linker.areTestsEnabled()) {
75 // For testing, set the Linker implementation and the test runner
76 // class name to match those used by the parent.
77 assert mLinkerParams != null;
78 Linker.setupForTesting(
79 mLinkerParams.mLinkerImplementationForTesting,
80 mLinkerParams.mTestRunnerClassNameForTesting);
81 }
82 return Linker.getInstance();
83 }
84
72 // Binder object used by clients for this service. 85 // Binder object used by clients for this service.
73 private final IChildProcessService.Stub mBinder = new IChildProcessService.S tub() { 86 private final IChildProcessService.Stub mBinder = new IChildProcessService.S tub() {
74 // NOTE: Implement any IChildProcessService methods here. 87 // NOTE: Implement any IChildProcessService methods here.
75 @Override 88 @Override
76 public int setupConnection(Bundle args, IChildProcessCallback callback) { 89 public int setupConnection(Bundle args, IChildProcessCallback callback) {
77 mCallback = callback; 90 mCallback = callback;
78 // Required to unparcel FileDescriptorInfo. 91 // Required to unparcel FileDescriptorInfo.
79 args.setClassLoader(getClassLoader()); 92 args.setClassLoader(getClassLoader());
80 synchronized (mMainThread) { 93 synchronized (mMainThread) {
81 // Allow the command line to be set via bind() intent or setupCo nnection, but 94 // Allow the command line to be set via bind() intent or setupCo nnection, but
82 // the FD can only be transferred here. 95 // the FD can only be transferred here.
83 if (mCommandLineParams == null) { 96 if (mCommandLineParams == null) {
84 mCommandLineParams = args.getStringArray( 97 mCommandLineParams = args.getStringArray(
85 ChildProcessConnection.EXTRA_COMMAND_LINE); 98 ChildProcessConnection.EXTRA_COMMAND_LINE);
86 } 99 }
87 // We must have received the command line by now 100 // We must have received the command line by now
88 assert mCommandLineParams != null; 101 assert mCommandLineParams != null;
89 mCpuCount = args.getInt(ChildProcessConnection.EXTRA_CPU_COUNT); 102 mCpuCount = args.getInt(ChildProcessConnection.EXTRA_CPU_COUNT);
90 mCpuFeatures = args.getLong(ChildProcessConnection.EXTRA_CPU_FEA TURES); 103 mCpuFeatures = args.getLong(ChildProcessConnection.EXTRA_CPU_FEA TURES);
91 assert mCpuCount > 0; 104 assert mCpuCount > 0;
92 Parcelable[] fdInfosAsParcelable = 105 Parcelable[] fdInfosAsParcelable =
93 args.getParcelableArray(ChildProcessConnection.EXTRA_FIL ES); 106 args.getParcelableArray(ChildProcessConnection.EXTRA_FIL ES);
94 // For why this arraycopy is necessary: 107 // For why this arraycopy is necessary:
95 // http://stackoverflow.com/questions/8745893/i-dont-get-why-thi s-classcastexception-occurs 108 // http://stackoverflow.com/questions/8745893/i-dont-get-why-thi s-classcastexception-occurs
96 mFdInfos = new FileDescriptorInfo[fdInfosAsParcelable.length]; 109 mFdInfos = new FileDescriptorInfo[fdInfosAsParcelable.length];
97 System.arraycopy(fdInfosAsParcelable, 0, mFdInfos, 0, fdInfosAsP arcelable.length); 110 System.arraycopy(fdInfosAsParcelable, 0, mFdInfos, 0, fdInfosAsP arcelable.length);
98 Bundle sharedRelros = args.getBundle(Linker.EXTRA_LINKER_SHARED_ RELROS); 111 Bundle sharedRelros = args.getBundle(Linker.EXTRA_LINKER_SHARED_ RELROS);
99 if (sharedRelros != null) { 112 if (sharedRelros != null) {
100 Linker.getInstance().useSharedRelros(sharedRelros); 113 getLinker().useSharedRelros(sharedRelros);
101 sharedRelros = null; 114 sharedRelros = null;
102 } 115 }
103 mMainThread.notifyAll(); 116 mMainThread.notifyAll();
104 } 117 }
105 return Process.myPid(); 118 return Process.myPid();
106 } 119 }
107 120
108 @Override 121 @Override
109 public void crashIntentionallyForTesting() { 122 public void crashIntentionallyForTesting() {
110 Process.killProcess(Process.myPid()); 123 Process.killProcess(Process.myPid());
111 } 124 }
112 }; 125 };
113 126
114 /* package */ static Context getContext() { 127 /* package */ static Context getContext() {
115 return sContext.get(); 128 return sContext.get();
116 } 129 }
117 130
118 // Return a new Linker instance. If testing, the Linker needs special setup.
119 private Linker getLinker() {
120 if (Linker.areLinkerTestsEnabled()) {
121 // If testing, set the Linker implementation and the test runner
122 // class name to match the one used by the parent.
123 assert mLinkerParams != null;
124 Linker.setLinkerImplementationForTesting(
125 mLinkerParams.mLinkerImplementationForTesting);
126 Linker linker = Linker.getInstance();
127 linker.setTestRunnerClassNameForTesting(
128 mLinkerParams.mTestRunnerClassNameForTesting);
129 return linker;
130 }
131 // Not testing, so return a normal the Linker instantiation.
132 return Linker.getInstance();
133 }
134
135 @Override 131 @Override
136 public void onCreate() { 132 public void onCreate() {
137 Log.i(TAG, "Creating new ChildProcessService pid=%d", Process.myPid()); 133 Log.i(TAG, "Creating new ChildProcessService pid=%d", Process.myPid());
138 if (sContext.get() != null) { 134 if (sContext.get() != null) {
139 throw new RuntimeException("Illegal child process reuse."); 135 throw new RuntimeException("Illegal child process reuse.");
140 } 136 }
141 sContext.set(this); 137 sContext.set(this);
142 super.onCreate(); 138 super.onCreate();
143 139
144 mMainThread = new Thread(new Runnable() { 140 mMainThread = new Thread(new Runnable() {
145 @Override 141 @Override
146 @SuppressFBWarnings("DM_EXIT") 142 @SuppressFBWarnings("DM_EXIT")
147 public void run() { 143 public void run() {
148 try { 144 try {
149 // CommandLine must be initialized before others, e.g., Link er.isUsed() 145 // CommandLine must be initialized before everything else.
150 // may check the command line options.
151 synchronized (mMainThread) { 146 synchronized (mMainThread) {
152 while (mCommandLineParams == null) { 147 while (mCommandLineParams == null) {
153 mMainThread.wait(); 148 mMainThread.wait();
154 } 149 }
155 } 150 }
156 CommandLine.init(mCommandLineParams); 151 CommandLine.init(mCommandLineParams);
157 Linker linker = getLinker(); 152
158 boolean useLinker = linker.isUsed(); 153 Linker linker = null;
159 boolean requestedSharedRelro = false; 154 boolean requestedSharedRelro = false;
160 if (useLinker) { 155 if (Linker.isUsed()) {
161 synchronized (mMainThread) { 156 synchronized (mMainThread) {
162 while (!mIsBound) { 157 while (!mIsBound) {
163 mMainThread.wait(); 158 mMainThread.wait();
164 } 159 }
165 } 160 }
161 linker = getLinker();
166 if (mLinkerParams.mWaitForSharedRelro) { 162 if (mLinkerParams.mWaitForSharedRelro) {
167 requestedSharedRelro = true; 163 requestedSharedRelro = true;
168 linker.initServiceProcess(mLinkerParams.mBaseLoadAdd ress); 164 linker.initServiceProcess(mLinkerParams.mBaseLoadAdd ress);
169 } else { 165 } else {
170 linker.disableSharedRelros(); 166 linker.disableSharedRelros();
171 } 167 }
172 } 168 }
173 boolean isLoaded = false; 169 boolean isLoaded = false;
174 if (CommandLine.getInstance().hasSwitch( 170 if (CommandLine.getInstance().hasSwitch(
175 BaseSwitches.RENDERER_WAIT_FOR_JAVA_DEBUGGER)) { 171 BaseSwitches.RENDERER_WAIT_FOR_JAVA_DEBUGGER)) {
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 private static native void nativeInitChildProcess( 405 private static native void nativeInitChildProcess(
410 ChildProcessService service, int cpuCount, long cpuFeatures); 406 ChildProcessService service, int cpuCount, long cpuFeatures);
411 407
412 /** 408 /**
413 * Force the child process to exit. 409 * Force the child process to exit.
414 */ 410 */
415 private static native void nativeExitChildProcess(); 411 private static native void nativeExitChildProcess();
416 412
417 private native void nativeShutdownMainThread(); 413 private native void nativeShutdownMainThread();
418 } 414 }
OLDNEW
« no previous file with comments | « content/content_tests.gypi ('k') | content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698