From a7e2a93ee49eb3d1cdd090d3909aa115959d55b5 Mon Sep 17 00:00:00 2001
From: Stefan Bodewig
Note2: All methods of a BuildListener except for the "Build
+ Started" and "Build Finished" events may occur on several threads
+ simultaneously - for example while Ant is executing
+ a <parallel>
task.
null
.
*/
- public void targetStarted(BuildEvent event) {
+ public synchronized void targetStarted(BuildEvent event) {
targetName = extractTargetName(event);
}
@@ -67,7 +67,7 @@ public class NoBannerLogger extends DefaultLogger {
*
* @param event Ignored in this implementation.
*/
- public void targetFinished(BuildEvent event) {
+ public synchronized void targetFinished(BuildEvent event) {
targetName = null;
}
@@ -88,9 +88,11 @@ public class NoBannerLogger extends DefaultLogger {
return;
}
- if (null != targetName) {
- out.println(StringUtils.LINE_SEP + targetName + ":");
- targetName = null;
+ synchronized (this) {
+ if (null != targetName) {
+ out.println(StringUtils.LINE_SEP + targetName + ":");
+ targetName = null;
+ }
}
super.messageLogged(event);
diff --git a/src/main/org/apache/tools/ant/Project.java b/src/main/org/apache/tools/ant/Project.java
index c64d6a781..4ab8ee301 100644
--- a/src/main/org/apache/tools/ant/Project.java
+++ b/src/main/org/apache/tools/ant/Project.java
@@ -172,6 +172,14 @@ public class Project implements ResourceFactory {
/** List of listeners to notify of build events. */
private Vector listeners = new Vector();
+ /** for each thread, record whether it is currently executing
+ messageLogged */
+ private final ThreadLocal isLoggingMessage = new ThreadLocal() {
+ protected Object initialValue() {
+ return Boolean.FALSE;
+ }
+ };
+
/**
* The Ant core classloader--may be null
if using
* parent classloader.
@@ -201,11 +209,6 @@ public class Project implements ResourceFactory {
*/
private boolean keepGoingMode = false;
- /**
- * Flag which catches Listeners which try to use System.out or System.err .
- */
- private boolean loggingMessage = false;
-
/**
* Set the input handler.
*
@@ -2144,8 +2147,7 @@ public class Project implements ResourceFactory {
} else {
event.setMessage(message, priority);
}
- synchronized (this) {
- if (loggingMessage) {
+ if (isLoggingMessage.get() != Boolean.FALSE) {
/*
* One of the Listeners has attempted to access
* System.err or System.out.
@@ -2162,16 +2164,15 @@ public class Project implements ResourceFactory {
return;
}
try {
- loggingMessage = true;
+ isLoggingMessage.set(Boolean.TRUE);
Iterator iter = listeners.iterator();
while (iter.hasNext()) {
BuildListener listener = (BuildListener) iter.next();
listener.messageLogged(event);
}
} finally {
- loggingMessage = false;
+ isLoggingMessage.set(Boolean.FALSE);
}
- }
}
/**
diff --git a/src/main/org/apache/tools/ant/listener/Log4jListener.java b/src/main/org/apache/tools/ant/listener/Log4jListener.java
index 059d1e56c..bf8d73390 100644
--- a/src/main/org/apache/tools/ant/listener/Log4jListener.java
+++ b/src/main/org/apache/tools/ant/listener/Log4jListener.java
@@ -34,7 +34,7 @@ import org.apache.tools.ant.Task;
public class Log4jListener implements BuildListener {
/** Indicates if the listener was initialized. */
- private boolean initialized = false;
+ private final boolean initialized;
/**
* log category we log into