/** Queue up a spawn requests for testing. */ @VisibleForTesting static void enqueuePendingSpawnForTesting(Context context) { sPendingSpawnQueue.enqueue( new PendingSpawnData( context, new String[0], 1, new FileDescriptorInfo[0], 0, CALLBACK_FOR_RENDERER_PROCESS, true)); }
private static void startInternal( Context context, final String[] commandLine, int childProcessId, FileDescriptorInfo[] filesToBeMapped, long clientContext, int callbackType, boolean inSandbox) { try { TraceEvent.begin("ChildProcessLauncher.startInternal"); ChildProcessConnection allocatedConnection = null; synchronized (ChildProcessLauncher.class) { if (inSandbox) { allocatedConnection = sSpareSandboxedConnection; sSpareSandboxedConnection = null; } } if (allocatedConnection == null) { boolean alwaysInForeground = false; if (callbackType == CALLBACK_FOR_GPU_PROCESS) alwaysInForeground = true; allocatedConnection = allocateBoundConnection(context, commandLine, inSandbox, alwaysInForeground); if (allocatedConnection == null) { Log.d(TAG, "Allocation of new service failed. Queuing up pending spawn."); sPendingSpawnQueue.enqueue( new PendingSpawnData( context, commandLine, childProcessId, filesToBeMapped, clientContext, callbackType, inSandbox)); return; } } Log.d( TAG, "Setting up connection to process: slot=" + allocatedConnection.getServiceNumber()); triggerConnectionSetup( allocatedConnection, commandLine, childProcessId, filesToBeMapped, callbackType, clientContext); } finally { TraceEvent.end("ChildProcessLauncher.startInternal"); } }
/** @return the count of pending spawns in the queue */ @VisibleForTesting static int pendingSpawnsCountForTesting() { return sPendingSpawnQueue.size(); }