Oh man those logger call stacks are notoriously difficult to deal with.

On 1 April 2014 01:24, Charles Duffy <char...@dyfis.net> wrote:

> The amount of "fun" otherwise involved when two separate threads called
> into Ivy code in parallel was considerable, and was regularly resulting in
> a logger stack with no relationship with any individual thread's call
> stack.
> On Mar 25, 2014 7:27 AM, "Maarten Coene" <maarten_co...@yahoo.com> wrote:
>
> > 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: "cdu...@apache.org" <cdu...@apache.org>
> > Aan: notificati...@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;
> >   * </p>
> >   */
> > public class MessageLoggerEngine implements MessageLogger {
> > -    private final Stack/*<MessageLogger>*/ loggerStack = new Stack();
> > +    private final ThreadLocal/*<Stack<MessageLogger>>*/ 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
> >       * </p>
> >       */
> >      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);
> >          }
>



-- 
Matt Sicker <boa...@gmail.com>

Reply via email to