Maybe a bit late, but what was the reason to use a ThreadLocal here? This gives issues when the configuration of Ivy (for instance setting a custom logger) is done from a different thread than the actual resolve. Maarten ________________________________ Van: "cduffy@apache.org" Aan: notifications@ant.apache.org Verzonden: vrijdag 27 december 18:40 2013 Onderwerp: svn commit: r1553704 - /ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java Author: cduffy Date: Fri Dec 27 17:40:20 2013 New Revision: 1553704 URL: http://svn.apache.org/r1553704 Log: Move non-root MessageLogger instances into a thread-local stack Logger context is inherently thread-local. Modified:     ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java?rev=1553704&r1=1553703&r2=1553704&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java Fri Dec 27 17:40:20 2013 @@ -34,7 +34,7 @@ import java.util.Stack;   *

  */ public class MessageLoggerEngine implements MessageLogger { -    private final Stack/**/ loggerStack = new Stack(); +    private final ThreadLocal/*>*/ loggerStacks = new ThreadLocal();         private MessageLogger defaultLogger = null; @@ -44,6 +44,15 @@ public class MessageLoggerEngine impleme     private List errors = new ArrayList();     +    private Stack getLoggerStack() { +        Stack stack = (Stack) loggerStacks.get(); +        if (stack == null) { +            stack = new Stack(); +            loggerStacks.set(stack); +        } +        return stack; +    } +        public MessageLoggerEngine() {     } @@ -66,7 +75,7 @@ public class MessageLoggerEngine impleme       */     public void pushLogger(MessageLogger logger) {         Checks.checkNotNull(logger, "logger"); -        loggerStack.push(logger); +        getLoggerStack().push(logger);     }         /** @@ -76,8 +85,8 @@ public class MessageLoggerEngine impleme       *

      */     public void popLogger() { -        if (!loggerStack.isEmpty()) { -            loggerStack.pop(); +        if (!getLoggerStack().isEmpty()) { +            getLoggerStack().pop();         }     } @@ -86,10 +95,10 @@ public class MessageLoggerEngine impleme       * @return the current logger, or the default one if there is no logger in the stack       */     public MessageLogger peekLogger() { -        if (loggerStack.isEmpty()) { +        if (getLoggerStack().isEmpty()) {             return getDefaultLogger();         } -        return (MessageLogger) loggerStack.peek(); +        return (MessageLogger) getLoggerStack().peek();     }     private MessageLogger getDefaultLogger() { @@ -130,7 +139,7 @@ public class MessageLoggerEngine impleme         public void clearProblems() {         getDefaultLogger().clearProblems(); -        for (Iterator iter = loggerStack.iterator(); iter.hasNext();) { +        for (Iterator iter = getLoggerStack().iterator(); iter.hasNext();) {             MessageLogger l = (MessageLogger) iter.next();             l.clearProblems();         } @@ -142,7 +151,7 @@ public class MessageLoggerEngine impleme     public void setShowProgress(boolean progress) {         getDefaultLogger().setShowProgress(progress);         // updates all loggers in the stack -        for (Iterator iter = loggerStack.iterator(); iter.hasNext();) { +        for (Iterator iter = getLoggerStack().iterator(); iter.hasNext();) {             MessageLogger l = (MessageLogger) iter.next();             l.setShowProgress(progress);         }