
Author: ceki Date: Tue Nov 13 11:41:22 2007 New Revision: 1602 Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/BasicStatusManager.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java Log: Synchronizing on ConcurrentModificationException in order to avoid ConcurrentModificationException exceptions on the list maintained by ConcurrentModificationException, as shown below java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449) at java.util.AbstractList$Itr.next(AbstractList.java:420) at ch.qos.logback.core.util.StatusPrinter.print(StatusPrinter.java:47) at ch.qos.logback.core.util.StatusPrinter.print(StatusPrinter.java:38) at ch.qos.logback.audit.server.AuditServerTest.testUnreachable(AuditServerTest.java:137) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) This can happen if multiple thread access BasicStatusManager simultaneously. Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/BasicStatusManager.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/BasicStatusManager.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/BasicStatusManager.java Tue Nov 13 11:41:22 2007 @@ -9,7 +9,6 @@ */ package ch.qos.logback.core; - import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -20,19 +19,22 @@ public class BasicStatusManager implements StatusManager { public static final int MAX_COUNT = 200; - + int count = 0; List<Status> statusList = new ArrayList<Status>(); int level = Status.INFO; - - public void add(Status newStatus) { - //System.out.println(newStatus); - if(count > MAX_COUNT) { + + // This method is synchronized on the instance. + // Code iterating on this.iterator is expected to + // also synchronize on this (the BasicStatusManager instance) + public synchronized void add(Status newStatus) { + // System.out.println(newStatus); + if (count > MAX_COUNT) { return; } count++; - - if(newStatus.getLevel() > level) { + + if (newStatus.getLevel() > level) { level = newStatus.getLevel(); } statusList.add(newStatus); @@ -47,8 +49,7 @@ } public int getCount() { - return count; + return count; } - } Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java Tue Nov 13 11:41:22 2007 @@ -41,12 +41,12 @@ } public static void print(StatusManager sm) { - - Iterator it = sm.iterator(); - while (it.hasNext()) { - Status s = (Status) it.next(); - print("", s); - + synchronized (sm) { + Iterator it = sm.iterator(); + while (it.hasNext()) { + Status s = (Status) it.next(); + print("", s); + } } }