From 6eda5dd9848859390062be8f6d70725f057150df Mon Sep 17 00:00:00 2001 From: David Inglis Date: Fri, 22 Nov 2002 14:53:48 +0000 Subject: [PATCH] fixed hanging with autobuild --- core/org.eclipse.cdt.core/ChangeLog | 5 +++ .../org/eclipse/cdt/core/CommandLauncher.java | 42 +++++++++++++++---- .../eclipse/cdt/internal/core/CBuilder.java | 2 +- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 16cced013fd..4301f2e9b4d 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,8 @@ +2002-11-22 David Inglis + * src/.../cdt/core/CommandLauncher.java + Make CommandLauncher.waitAndRead do the stream writing, since ui components + process this stream, and this method may be call in a ui thread. + 2002-11-20 David Inglis * src/.../internal/core/CBuilder.java fix AUTO_BUILDs so that the builder only builds when the resources change diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java index 12322b76dfa..d92c79b25a0 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java @@ -7,13 +7,15 @@ package org.eclipse.cdt.core; import java.io.IOException; import java.io.OutputStream; - +import java.io.PipedInputStream; +import java.io.PipedOutputStream; import java.util.Properties; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; + +import org.eclipse.cdt.internal.core.ProcessClosure; import org.eclipse.cdt.utils.spawner.EnvironmentReader; import org.eclipse.cdt.utils.spawner.ProcessFactory; -import org.eclipse.cdt.internal.core.*; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; public class CommandLauncher { @@ -120,12 +122,38 @@ public class CommandLauncher { if (fProcess == null) { return ILLEGAL_COMMAND; } - - ProcessClosure closure= new ProcessClosure(fProcess, out, err); + + PipedOutputStream errOutPipe = new PipedOutputStream(); + PipedOutputStream outputPipe = new PipedOutputStream(); + PipedInputStream errInPipe, inputPipe; + try { + errInPipe = new PipedInputStream(errOutPipe); + inputPipe = new PipedInputStream(outputPipe); + } catch( IOException e ) { + return COMMAND_CANCELED; + } + + ProcessClosure closure= new ProcessClosure(fProcess, outputPipe, errOutPipe); closure.runNonBlocking(); + byte buffer[] = new byte[1024]; + int nbytes; while (!monitor.isCanceled() && closure.isAlive()) { try { - Thread.sleep(DELAY); + if ( errInPipe.available() > 0 ) { + nbytes = errInPipe.read(buffer); + err.write(buffer, 0, nbytes); + err.flush(); + } + if ( inputPipe.available() > 0 ) { + nbytes = inputPipe.read(buffer); + out.write(buffer, 0, nbytes); + out.flush(); + } + } catch( IOException e) { + } + monitor.worked(0); + try { + Thread.sleep(DELAY); } catch (InterruptedException ie) { } } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CBuilder.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CBuilder.java index adb6ae3629b..6f167ea208f 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CBuilder.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CBuilder.java @@ -172,9 +172,9 @@ public class CBuilder extends ACBuilder { cos.flush(); fatalBuild = true; } - subMonitor.done(); monitor.setCanceled(isCanceled); + cos.close(); } } catch (Exception e) {