package com.jediterm.terminal;
import com.google.common.base.Predicate;
import org.apache.log4j.Logger;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
public class TtyConnectorWaitFor {
private static final Logger LOG = Logger.getLogger(TtyConnectorWaitFor.class);
private final Future<?> myWaitForThreadFuture;
private final BlockingQueue<Predicate<Integer>> myTerminationCallback = new ArrayBlockingQueue<Predicate<Integer>>(1);
public void detach() {
myWaitForThreadFuture.cancel(true);
}
public TtyConnectorWaitFor(final TtyConnector ttyConnector, final ExecutorService executor) {
myWaitForThreadFuture = executor.submit(new Runnable() {
@Override
public void run() {
int exitCode = 0;
try {
while (true) {
try {
exitCode = ttyConnector.waitFor();
break;
}
catch (InterruptedException e) {
LOG.debug(e);
}
}
}
finally {
try {
myTerminationCallback.take().apply(exitCode);
}
catch (InterruptedException e) {
LOG.info(e);
}
}
}
});
}
public void setTerminationCallback(Predicate<Integer> r) {
myTerminationCallback.offer(r);
}
}