test/java/rmi/testlibrary/JavaVM.java

Print this page
rev 9281 : 8032050: Clean up for java/rmi/activation/Activatable/shutdownGracefully/ShutdownGracefully.java
Reviewed-by: smarks

*** 24,33 **** --- 24,34 ---- import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; import java.util.StringTokenizer; + import java.util.concurrent.TimeoutException; /** * RMI regression test utility class that uses Runtime.exec to spawn a * java process that will run a named java class. */
*** 171,180 **** --- 172,215 ---- errPipe.join(); return status; } /** + * Causes the current thread to wait the vm process to exit, if necessary, + * wait until the vm process has terminated, or the specified waiting time + * elapses. Release allocated input/output after vm process has terminated. + * @param timeout the maximum milliseconds to wait. + * @return exit value for vm process. + * @throws InterruptedException if the current thread is interrupted + * while waiting. + * @throws TimeoutException if subprocess does not end after timeout + * milliseconds passed + */ + public int waitFor(long timeout) + throws InterruptedException, TimeoutException { + if (vm == null) + throw new IllegalStateException("can't wait for JavaVM that isn't running"); + long startTime = System.currentTimeMillis(); + long rem = timeout; + + do { + try { + int status = vm.exitValue(); + outPipe.join(); + errPipe.join(); + return status; + } catch (IllegalThreadStateException ex) { + if (rem > 0) { + Thread.sleep(Math.min(rem, 100)); + } + } + rem = timeout - (System.currentTimeMillis() - startTime); + } while (rem > 0); + throw new TimeoutException(); + } + + /** * Starts the subprocess, waits for it to exit, and returns its exit status. */ public int execute() throws IOException, InterruptedException { start(); return waitFor();