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

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

Issue 1156183003: Pass file Regions along with FDs to child processes on Android (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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.ComponentName; 7 import android.content.ComponentName;
8 import android.content.Context; 8 import android.content.Context;
9 import android.content.Intent; 9 import android.content.Intent;
10 import android.content.ServiceConnection; 10 import android.content.ServiceConnection;
11 import android.os.Bundle; 11 import android.os.Bundle;
12 import android.os.DeadObjectException; 12 import android.os.DeadObjectException;
13 import android.os.IBinder; 13 import android.os.IBinder;
14 import android.os.ParcelFileDescriptor;
15 import android.os.RemoteException; 14 import android.os.RemoteException;
16 import android.util.Log; 15 import android.util.Log;
17 16
18 import org.chromium.base.CpuFeatures; 17 import org.chromium.base.CpuFeatures;
19 import org.chromium.base.ThreadUtils; 18 import org.chromium.base.ThreadUtils;
20 import org.chromium.base.TraceEvent; 19 import org.chromium.base.TraceEvent;
21 import org.chromium.base.VisibleForTesting; 20 import org.chromium.base.VisibleForTesting;
22 import org.chromium.base.library_loader.Linker; 21 import org.chromium.base.library_loader.Linker;
23 import org.chromium.content.app.ChildProcessService; 22 import org.chromium.content.app.ChildProcessService;
24 import org.chromium.content.app.ChromiumLinkerParams; 23 import org.chromium.content.app.ChromiumLinkerParams;
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 */ 312 */
314 private void doConnectionSetupLocked() { 313 private void doConnectionSetupLocked() {
315 try { 314 try {
316 TraceEvent.begin("ChildProcessConnectionImpl.doConnectionSetupLocked "); 315 TraceEvent.begin("ChildProcessConnectionImpl.doConnectionSetupLocked ");
317 assert mServiceConnectComplete && mService != null; 316 assert mServiceConnectComplete && mService != null;
318 assert mConnectionParams != null; 317 assert mConnectionParams != null;
319 318
320 Bundle bundle = new Bundle(); 319 Bundle bundle = new Bundle();
321 bundle.putStringArray(EXTRA_COMMAND_LINE, mConnectionParams.mCommand Line); 320 bundle.putStringArray(EXTRA_COMMAND_LINE, mConnectionParams.mCommand Line);
322 321
323 FileDescriptorInfo[] fileInfos = mConnectionParams.mFilesToBeMapped; 322 bundle.putParcelableArray(EXTRA_FILES, mConnectionParams.mFilesToBeM apped);
324 ParcelFileDescriptor[] parcelFiles = new ParcelFileDescriptor[fileIn fos.length];
325 for (int i = 0; i < fileInfos.length; i++) {
326 if (fileInfos[i].mFd == -1) {
327 // If someone provided an invalid FD, they are doing somethi ng wrong.
328 Log.e(TAG, "Invalid FD (id=" + fileInfos[i].mId + ") for pro cess connection, "
329 + "aborting connection.");
330 return;
331 }
332 String idName = EXTRA_FILES_PREFIX + i + EXTRA_FILES_ID_SUFFIX;
333 String fdName = EXTRA_FILES_PREFIX + i + EXTRA_FILES_FD_SUFFIX;
334 if (fileInfos[i].mAutoClose) {
335 // Adopt the FD, it will be closed when we close the ParcelF ileDescriptor.
336 parcelFiles[i] = ParcelFileDescriptor.adoptFd(fileInfos[i].m Fd);
337 } else {
338 try {
339 parcelFiles[i] = ParcelFileDescriptor.fromFd(fileInfos[i ].mFd);
340 } catch (IOException e) {
341 Log.e(TAG,
342 "Invalid FD provided for process connection, abo rting connection.",
343 e);
344 return;
345 }
346
347 }
348 bundle.putParcelable(fdName, parcelFiles[i]);
349 bundle.putInt(idName, fileInfos[i].mId);
350 }
351 // Add the CPU properties now. 323 // Add the CPU properties now.
352 bundle.putInt(EXTRA_CPU_COUNT, CpuFeatures.getCount()); 324 bundle.putInt(EXTRA_CPU_COUNT, CpuFeatures.getCount());
353 bundle.putLong(EXTRA_CPU_FEATURES, CpuFeatures.getMask()); 325 bundle.putLong(EXTRA_CPU_FEATURES, CpuFeatures.getMask());
354 326
355 bundle.putBundle(Linker.EXTRA_LINKER_SHARED_RELROS, 327 bundle.putBundle(Linker.EXTRA_LINKER_SHARED_RELROS,
356 mConnectionParams.mSharedRelros); 328 mConnectionParams.mSharedRelros);
357 329
358 try { 330 try {
359 mPid = mService.setupConnection(bundle, mConnectionParams.mCallb ack); 331 mPid = mService.setupConnection(bundle, mConnectionParams.mCallb ack);
360 assert mPid != 0 : "Child service claims to be run by a process of pid=0."; 332 assert mPid != 0 : "Child service claims to be run by a process of pid=0.";
361 } catch (android.os.RemoteException re) { 333 } catch (android.os.RemoteException re) {
362 Log.e(TAG, "Failed to setup connection.", re); 334 Log.e(TAG, "Failed to setup connection.", re);
363 } 335 }
364 // We proactively close the FDs rather than wait for GC & finalizer. 336 // We proactively close the FDs rather than wait for GC & finalizer.
365 try { 337 try {
366 for (ParcelFileDescriptor parcelFile : parcelFiles) { 338 for (FileDescriptorInfo fileInfo : mConnectionParams.mFilesToBeM apped) {
367 if (parcelFile != null) parcelFile.close(); 339 fileInfo.mFd.close();
368 } 340 }
369 } catch (IOException ioe) { 341 } catch (IOException ioe) {
370 Log.w(TAG, "Failed to close FD.", ioe); 342 Log.w(TAG, "Failed to close FD.", ioe);
371 } 343 }
372 mConnectionParams = null; 344 mConnectionParams = null;
373 345
374 if (mConnectionCallback != null) { 346 if (mConnectionCallback != null) {
375 mConnectionCallback.onConnected(mPid); 347 mConnectionCallback.onConnected(mPid);
376 } 348 }
377 mConnectionCallback = null; 349 mConnectionCallback = null;
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 return true; 441 return true;
470 } 442 }
471 return false; 443 return false;
472 } 444 }
473 445
474 @VisibleForTesting 446 @VisibleForTesting
475 public boolean isConnected() { 447 public boolean isConnected() {
476 return mService != null; 448 return mService != null;
477 } 449 }
478 } 450 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698