You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by Charles Duffy <ch...@dyfis.net> on 2014/04/01 08:24:55 UTC
Re: svn commit: r1553704 - /ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java
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" <ma...@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: "cduffy@apache.org" <cd...@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;
> * </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);
> }
Re: svn commit: r1553704 - /ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java
Posted by Matt Sicker <bo...@gmail.com>.
Oh man those logger call stacks are notoriously difficult to deal with.
On 1 April 2014 01:24, Charles Duffy <ch...@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" <ma...@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: "cduffy@apache.org" <cd...@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;
> > * </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 <bo...@gmail.com>