diff --git a/WHATSNEW b/WHATSNEW index 8658a1933..e1cf6dc1f 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -29,6 +29,9 @@ Fixed bugs: files. Bugzilla Report 50866. + * Read on System.in hangs for forked java task. + Bugzilla Report 50960. + Other changes: -------------- diff --git a/src/etc/testcases/taskdefs/java.xml b/src/etc/testcases/taskdefs/java.xml index 16a71df0d..2a7fe3c74 100644 --- a/src/etc/testcases/taskdefs/java.xml +++ b/src/etc/testcases/taskdefs/java.xml @@ -387,6 +387,11 @@ redirect.err="${redirect.err}" should be empty + + + + @@ -395,4 +400,5 @@ redirect.err="${redirect.err}" should be empty + diff --git a/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java b/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java index c63460792..2ccae1e74 100644 --- a/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java +++ b/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java @@ -273,10 +273,9 @@ public class PumpStreamHandler implements ExecuteStreamHandler { */ protected Thread createPump(InputStream is, OutputStream os, boolean closeWhenExhausted, boolean nonBlockingIO) { - final Thread result - = new ThreadWithPumper(new StreamPumper(is, os, - closeWhenExhausted, - nonBlockingIO)); + StreamPumper pumper = new StreamPumper(is, os, closeWhenExhausted, nonBlockingIO); + pumper.setAutoflush(true); + final Thread result = new ThreadWithPumper(pumper); result.setDaemon(true); return result; } diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/JavaTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/JavaTest.java index bee211e6b..6812d88e6 100644 --- a/src/tests/junit/org/apache/tools/ant/taskdefs/JavaTest.java +++ b/src/tests/junit/org/apache/tools/ant/taskdefs/JavaTest.java @@ -18,10 +18,12 @@ package org.apache.tools.ant.taskdefs; +import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PipedInputStream; @@ -260,6 +262,40 @@ public class JavaTest extends BuildFileTest { assertEquals("foo", project.getProperty("input.value")); } + public void testFlushedInput() throws Exception { + final PipedOutputStream out = new PipedOutputStream(); + final PipedInputStream in = new PipedInputStream(out); + project.setInputHandler(new DefaultInputHandler() { + protected InputStream getInputStream() { + return in; + } + }); + project.setDefaultInputStream(in); + + final boolean[] timeout = new boolean[1]; + timeout[0] = false; + + Thread writingThread = new Thread(new Runnable() { + public void run() { + try { + // wait a little bit to have the target executed + Thread.sleep(500); + } catch (InterruptedException e) { + // don't care + } + try { + out.write("foo-FlushedInput\n".getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }); + writingThread.setDaemon(true); + + writingThread.start(); + executeTarget("flushedInput"); + } + /** * entry point class with no dependencies other * than normal JRE runtime @@ -372,4 +408,12 @@ public class JavaTest extends BuildFileTest { } } } + + public static class ReadPoint { + public static void main(String[] args) throws IOException { + String line = new BufferedReader(new InputStreamReader(System.in)).readLine(); + System.out.println(line); + } + } + }