Index: content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java |
index 2ad7b8aeb369b0d06f63816d03cd423df204ecc1..de8e0f3457a3c253d069bff721b4721bba40b9df 100644 |
--- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java |
+++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java |
@@ -21,6 +21,7 @@ import org.chromium.base.TraceEvent; |
import org.chromium.base.VisibleForTesting; |
import org.chromium.base.process_launcher.ChildProcessCreationParams; |
import org.chromium.base.process_launcher.FileDescriptorInfo; |
+import org.chromium.base.process_launcher.ICallbackInt; |
import org.chromium.base.process_launcher.IChildProcessService; |
import java.io.IOException; |
@@ -389,6 +390,18 @@ public class ChildProcessConnectionImpl implements ChildProcessConnection { |
} |
} |
+ private void onSetupConnectionResult(int pid) { |
+ synchronized (mLock) { |
+ mPid = pid; |
+ assert mPid != 0 : "Child service claims to be run by a process of pid=0."; |
+ |
+ if (mConnectionCallback != null) { |
+ mConnectionCallback.onConnected(mPid); |
+ } |
+ mConnectionCallback = null; |
+ } |
+ } |
+ |
/** |
* Called after the connection parameters have been set (in setupConnection()) *and* a |
* connection has been established (as signaled by onServiceConnected()). These two events can |
@@ -402,10 +415,20 @@ public class ChildProcessConnectionImpl implements ChildProcessConnection { |
Bundle bundle = ChildProcessLauncher.createsServiceBundle( |
mConnectionParams.mCommandLine, mConnectionParams.mFilesToBeMapped); |
+ ICallbackInt pidCallback = new ICallbackInt.Stub() { |
+ @Override |
+ public void call(final int pid) { |
+ LauncherThread.post(new Runnable() { |
+ @Override |
+ public void run() { |
+ onSetupConnectionResult(pid); |
+ } |
+ }); |
+ } |
+ }; |
try { |
- mPid = mService.setupConnection(bundle, mConnectionParams.mCallback); |
- assert mPid != 0 : "Child service claims to be run by a process of pid=0."; |
- } catch (android.os.RemoteException re) { |
+ mService.setupConnection(bundle, pidCallback, mConnectionParams.mCallback); |
+ } catch (RemoteException re) { |
Log.e(TAG, "Failed to setup connection.", re); |
} |
// We proactively close the FDs rather than wait for GC & finalizer. |
@@ -417,11 +440,6 @@ public class ChildProcessConnectionImpl implements ChildProcessConnection { |
Log.w(TAG, "Failed to close FD.", ioe); |
} |
mConnectionParams = null; |
- |
- if (mConnectionCallback != null) { |
- mConnectionCallback.onConnected(mPid); |
- } |
- mConnectionCallback = null; |
} finally { |
TraceEvent.end("ChildProcessConnectionImpl.doConnectionSetupLocked"); |
} |