From f6e5dc2b7a62d5b26c0e4c2e13d046b3f0f773d9 Mon Sep 17 00:00:00 2001 From: Martin Oberhuber < martin.oberhuber@windriver.com> Date: Wed, 14 Sep 2011 16:36:03 +0000 Subject: [PATCH] Bug 356132 - TerminalServiceHostShell with SshTerminalShell on slower targets will hang the shell when writeToShell with commands on shell that is not ready to accept command yet --- .../shells/TerminalServiceHostShell.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/internal/services/shells/TerminalServiceHostShell.java b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/internal/services/shells/TerminalServiceHostShell.java index 9c3d410b8e1..6ef342a3034 100644 --- a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/internal/services/shells/TerminalServiceHostShell.java +++ b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/internal/services/shells/TerminalServiceHostShell.java @@ -21,6 +21,7 @@ * Anna Dushistova (MontaVista) - [240523] [rseterminals] Provide a generic adapter factory that adapts any ITerminalService to an IShellService * Anna Dushistova (MontaVista) - [258720] SshHostShell fails to run command if initialWorkingDirectory supplied * Rob Stryker (JBoss) - [335059] TerminalServiceShellOutputReader logs error when hostShell.exit() is called + * Martin Oberhuber (Wind River) - [356132] wait for initial output *******************************************************************************/ package org.eclipse.rse.internal.services.shells; @@ -59,17 +60,21 @@ public class TerminalServiceHostShell extends AbstractHostShell { try { fTerminalShell = terminalShell; String encoding = fTerminalShell.getDefaultEncoding(); + BufferedReader bufReader; if (encoding != null) { - fStdoutHandler = new TerminalServiceShellOutputReader(this, - new BufferedReader(new InputStreamReader(fTerminalShell - .getInputStream(), encoding)), false); + bufReader = new BufferedReader(new InputStreamReader(fTerminalShell + .getInputStream(), encoding)); } else { - fStdoutHandler = new TerminalServiceShellOutputReader(this, - new BufferedReader(new InputStreamReader(fTerminalShell - .getInputStream())), false); + bufReader = new BufferedReader(new InputStreamReader(fTerminalShell + .getInputStream())); } - fStderrHandler = new TerminalServiceShellOutputReader(this, null, - true); + //bug 356132: wait for initial output before sending any command + bufReader.mark(1); + bufReader.read(); + bufReader.reset(); + + fStdoutHandler = new TerminalServiceShellOutputReader(this, bufReader, false); + fStderrHandler = new TerminalServiceShellOutputReader(this, null, true); OutputStream outputStream = fTerminalShell.getOutputStream(); if (encoding != null) { // use specified encoding