Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Emit "\n(timeout)" when run_limited exceeded the limit.
  • Loading branch information
peschwa committed Mar 21, 2015
1 parent 004206b commit 018a450
Showing 1 changed file with 16 additions and 6 deletions.
22 changes: 16 additions & 6 deletions src/vm/jvm/runtime/org/perl6/nqp/tools/EvalServer.java
Expand Up @@ -19,10 +19,12 @@
import java.security.SecureRandom;
import java.util.EnumSet;
import java.util.Set;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.Arrays;
import java.util.concurrent.Future;

import org.perl6.nqp.runtime.Base64;
import org.perl6.nqp.runtime.CodeRef;
Expand Down Expand Up @@ -147,9 +149,11 @@ private class ServiceThread extends Thread {

private class RunThread extends Thread {
private String[] argv;
private PrintStream ops;

public RunThread(String[] argv) {
public RunThread(String[] argv, PrintStream ops) {
this.argv = argv;
this.ops = ops;
}

@Override
Expand All @@ -174,7 +178,7 @@ public void run() {
private void eval() throws Exception {
GlobalContext gc = new GlobalContext();
gc.in = new ByteArrayInputStream(new byte[0]);
gc.out = gc.err = new PrintStream( Channels.newOutputStream(sock), true, "UTF-8" );
gc.out = gc.err = this.ops;
gc.interceptExit = true;
gc.sharingHint = true;

Expand Down Expand Up @@ -222,17 +226,23 @@ private void service() throws Exception {
System.exit(0);
}
else if (cmdStrings[1].equals("run")) {
Thread runner = new RunThread(argv);
PrintStream out = new PrintStream( Channels.newOutputStream(sock), true, "UTF-8" );
Thread runner = new RunThread(argv, out);
runner.run();
runner.join();
out.close();
}
else if (cmdStrings[1].equals("run_limited")) {
PrintStream out = new PrintStream( Channels.newOutputStream(sock), true, "UTF-8" );
Integer timeout = new Integer(cmdStrings[2]);
ExecutorService ste = Executors.newSingleThreadExecutor();
argv = new String[cmdStrings.length - 4];
System.arraycopy(cmdStrings, 3, argv, 0, argv.length);
Thread runner = new RunThread(argv);
ste.invokeAll(Arrays.asList(Executors.callable(runner)), timeout, TimeUnit.SECONDS);
Thread runner = new RunThread(argv, out);
List<Future<Object>> future = ste.invokeAll(Arrays.asList(Executors.callable(runner)), timeout, TimeUnit.SECONDS);
if(future.get(0).isCancelled()) {
out.println("\n(timeout)");
}
}
else {
throw new RuntimeException("Unknown command "+cmdStrings[1]);
Expand Down

0 comments on commit 018a450

Please sign in to comment.