From 4ef885df62bc772586ac609c47f8580917405718 Mon Sep 17 00:00:00 2001 From: Tim Whittington Date: Mon, 12 Aug 2013 08:36:02 +1200 Subject: [PATCH] Signal StreamPumper to finish before joining on it, otherwise all execs incur JOIN_TIMEOUT overhead. Drain available data in StreamPumper on finish, to allow output from fast executing tasks to be captured. Fixes https://issues.apache.org/bugzilla/show_bug.cgi?id=54128 --- src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java | 2 +- src/main/org/apache/tools/ant/taskdefs/StreamPumper.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java b/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java index 2ccae1e..42ba0f4 100644 --- a/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java +++ b/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java @@ -185,10 +185,10 @@ public class PumpStreamHandler implements ExecuteStreamHandler { return; } - t.join(JOIN_TIMEOUT); if (s != null && !s.isFinished()) { s.stop(); } + t.join(JOIN_TIMEOUT); while ((s == null || !s.isFinished()) && t.isAlive()) { t.interrupt(); t.join(JOIN_TIMEOUT); diff --git a/src/main/org/apache/tools/ant/taskdefs/StreamPumper.java b/src/main/org/apache/tools/ant/taskdefs/StreamPumper.java index c4ad991..908e809 100644 --- a/src/main/org/apache/tools/ant/taskdefs/StreamPumper.java +++ b/src/main/org/apache/tools/ant/taskdefs/StreamPumper.java @@ -139,6 +139,16 @@ public class StreamPumper implements Runnable { } } os.flush(); + // On completion, drain any available data (which might be the first data available for quick executions) + if (finish && useAvailable) { + while((length = is.available()) > 0) { + length = is.read(buf, 0, Math.min(length, buf.length)); + if (length <= 0) { + break; + } + os.write(buf, 0, length); + } + } } catch (InterruptedException ie) { // likely PumpStreamHandler trying to stop us } catch (Exception e) { -- 1.7.11.1