public void onSlaveTerminated(Process process) { synchronized (mAlarm) { mExitStatus = process.getExitStatus(); if (!process.isRunning()) { mProcesses.remove(process); mZombies.add(process); mAlarm.alarm(); } } }
private Process findZombie(Pid pid) throws UnixException { Process process = mZombies.remove(pid); if (process != null) { return process; } if (!mProcesses.contains(pid)) { // Another thread got the zombie. throw new UnixException(Errno.ECHILD); } return null; }
public void kill(Pid pid, Signal sig) throws UnixException { Process process = mProcesses.get(pid); if (process == null) { throw new UnixException(Errno.ESRCH); } process.kill(sig); }
public int run( SyscallReadableChannel in, SyscallWritableChannel out, NormalizedPath currentDirectory, InputStream stdin, OutputStream stdout, OutputStream stderr, Permissions permissions, Links links, Slave.Listener listener, String resourceDirectory) throws IOException, InterruptedException { mLogger.info("starting a slave application"); mResourceDirectory = resourceDirectory; initializeInitProcess(); Process process = new Process(mPidGenerator.next(), mInit); mInit.addChild(process); addProcess(process); Pipe slave2hub = Pipe.open(); Pipe hub2slave = Pipe.open(); Slave slave = new Slave( this, process, new SyscallReadableChannel(hub2slave.source()), new SyscallWritableChannel(slave2hub.sink()), currentDirectory, stdin, stdout, stderr, permissions, links, listener); process.add(slave); mSlaveHub = new SlaveHub( this, in, out, new SyscallReadableChannel(slave2hub.source()), new SyscallWritableChannel(hub2slave.sink())); new Thread(slave).start(); mSlaveHub.work(); synchronized (mAlarm) { while (!mProcesses.isEmpty()) { mAlarm.wait(); } } return !mCancelled ? mExitStatus : 255; }
private void addProcess(Process process) { mProcesses.add(process); }