Fix proxy command execution. Change-Id: I757bba86589f5d17889fdec0e9a643549960e258 Signed-off-by: Greg Watson <g.watson@computer.org>
diff --git a/bundles/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnection.java b/bundles/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnection.java index 358ab98..3e28abd 100644 --- a/bundles/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnection.java +++ b/bundles/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnection.java
@@ -42,10 +42,6 @@ public class ProxyConnection implements IRemoteConnectionControlService, IRemoteConnectionChangeListener, IRemoteProxyService, IRemoteProcessService { - private final boolean logging = false; - - public static final String EMPTY_STRING = ""; //$NON-NLS-1$ - private String fWorkingDir; private ChannelMultiplexer channelMux; private MultiplexedChannel commandChannel; @@ -121,7 +117,7 @@ @Override public void setStreams(InputStream in, OutputStream out) { - channelMux = new ChannelMultiplexer("", this, in, out); + channelMux = new ChannelMultiplexer("C", this, in, out); } /* @@ -228,6 +224,7 @@ private StringBuffer stdout = new StringBuffer(); private StringBuffer stderr = new StringBuffer(); + @SuppressWarnings("unused") private String executeCommand(List<String> command, IProgressMonitor monitor) throws ProxyException { try { final MultiplexedChannel chanA = channelMux.openChannel();
diff --git a/bundles/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyProcess.java b/bundles/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyProcess.java index fe0b338..45e4dd6 100644 --- a/bundles/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyProcess.java +++ b/bundles/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyProcess.java
@@ -18,11 +18,10 @@ import org.eclipse.remote.core.IRemoteProcessBuilder; import org.eclipse.remote.core.IRemoteProcessControlService; import org.eclipse.remote.core.IRemoteProcessTerminalService; -import org.eclipse.remote.internal.core.RemoteProcess; +import org.eclipse.remote.core.RemoteProcess; public class ProxyProcess extends RemoteProcess implements IRemoteProcessControlService, IRemoteProcessTerminalService { private IRemoteProcess remoteProcess; - private int width, height; private final InputStream procStdout; private final InputStream procStderr; private final OutputStream procStdin; @@ -94,7 +93,7 @@ @Override public int exitValue() { if (!isCompleted) { - throw new IllegalStateException(); + throw new IllegalThreadStateException(); } return exitValue; }
diff --git a/bundles/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/commands/ServerExecCommand.java b/bundles/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/commands/ServerExecCommand.java index 5ccd52e..b52aa0a 100644 --- a/bundles/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/commands/ServerExecCommand.java +++ b/bundles/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/commands/ServerExecCommand.java
@@ -36,6 +36,8 @@ private final DataOutputStream result; private final DataInputStream cmd; + private Process proc; + private class CommandRunner implements Runnable { @Override public void run() { @@ -61,28 +63,36 @@ } builder.redirectErrorStream(redirect); try { - Process proc = builder.start(); + proc = builder.start(); startForwarder("stdout", proc.getInputStream(), stdout); startForwarder("stderr", proc.getErrorStream(), stderr); startForwarder("stdin", stdin, proc.getOutputStream()); System.err.println("waiting for proc"); - while (cmd.available() == 0 && proc.isAlive()) { - Thread.sleep(500); - } - System.err.println("done waiting for proc"); - if (cmd.available() > 0) { - cmd.readByte(); - proc.destroyForcibly(); - } + new Thread(new ProcMonitor(), "process monitor").start(); int exit = proc.waitFor(); System.err.println("exit status="+exit); result.writeInt(exit); + result.flush(); } catch (IOException | InterruptedException e) { // Ignore? } } } + private class ProcMonitor implements Runnable { + @Override + public void run() { + try { + cmd.readByte(); + if (proc.isAlive()) { + proc.destroyForcibly(); + } + } catch (IOException e) { + // Finish + } + } + } + private class Forwarder implements Runnable { private final InputStream in; private final OutputStream out;
diff --git a/tests/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/ProcessTests.java b/tests/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/ProcessTests.java index 6452df4..b149746 100644 --- a/tests/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/ProcessTests.java +++ b/tests/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/ProcessTests.java
@@ -114,9 +114,15 @@ public void run() { try { BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream())); - String line; - while ((line = stdout.readLine()) != null) { + String line = stdout.readLine(); + int count = Integer.parseInt(line); + for (int i = 0 ; i < count; i++) { + line = stdout.readLine(); + if (line == null) { + break; + } result.append(line); + System.out.println(line); } try { proc.destroy(); @@ -136,12 +142,15 @@ public void run() { try { BufferedWriter stdin = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); + int count = 10; + String line = count + "\n"; + stdin.write(line); + stdin.flush(); for (int i = 0; i < 10; i++) { - String line = i + "\n"; - stdin.append(line); + line = i + "\n"; + stdin.write(line); stdin.flush(); } - proc.getOutputStream().close(); try { proc.waitFor(); } catch (InterruptedException e) { @@ -170,7 +179,7 @@ } public void testExitValue() { - IRemoteProcessBuilder builder = processService.getProcessBuilder(new String[]{"sleep","60"}); //$NON-NLS-1$ + IRemoteProcessBuilder builder = processService.getProcessBuilder(new String[]{"sleep","50"}); //$NON-NLS-1$ assertNotNull(builder); IRemoteProcess rp = null; try { @@ -187,6 +196,13 @@ } catch(IllegalThreadStateException e) { e.printStackTrace(); } + try { + p.destroyForcibly(); + p.waitFor(); + } catch (InterruptedException e) { + fail(e.getMessage()); + } + assertFalse(p.isAlive()); } /*