mwomack 2002/12/11 21:20:22 Modified: src/java/org/apache/log4j Hierarchy.java Log: Switched listener lists from Vector to ArrayList to avoid some unneeded synchronization charges. Thread safety changes. Added synchronization for listener lists when adding/removing and copying when reporting events. Revision Changes Path 1.44 +71 -71 jakarta-log4j/src/java/org/apache/log4j/Hierarchy.java Index: Hierarchy.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/Hierarchy.java,v retrieving revision 1.43 retrieving revision 1.44 diff -u -r1.43 -r1.44 --- Hierarchy.java 22 Nov 2002 11:03:28 -0000 1.43 +++ Hierarchy.java 12 Dec 2002 05:20:22 -0000 1.44 @@ -15,6 +15,7 @@ import java.util.Hashtable; import java.util.Enumeration; import java.util.Vector; +import java.util.ArrayList; import org.apache.log4j.spi.LoggerFactory; import org.apache.log4j.spi.HierarchyEventListener; @@ -57,8 +58,8 @@ public class Hierarchy implements LoggerRepository, RendererSupport { private LoggerFactory defaultFactory; - private Vector repositoryEventListeners; - private Vector loggerEventListeners; + private ArrayList repositoryEventListeners; + private ArrayList loggerEventListeners; Hashtable ht; Logger root; @@ -79,8 +80,8 @@ public Hierarchy(Logger root) { ht = new Hashtable(); - repositoryEventListeners = new Vector(1); - loggerEventListeners = new Vector(1); + repositoryEventListeners = new ArrayList(1); + loggerEventListeners = new ArrayList(1); this.root = root; // Enable all level levels by default. setThreshold(Level.ALL); @@ -102,12 +103,14 @@ @since 1.3*/ public void addLoggerRepositoryEventListener( LoggerRepositoryEventListener listener) { - - if(repositoryEventListeners.contains(listener)) { - LogLog.warn( - "Ignoring attempt to add a previously registerd LoggerRepositoryEventListener."); - } else { - repositoryEventListeners.addElement(listener); + + synchronized(repositoryEventListeners) { + if(repositoryEventListeners.contains(listener)) { + LogLog.warn( + "Ignoring attempt to add a previously registerd LoggerRepositoryEventListener."); + } else { + repositoryEventListeners.add(listener); + } } } @@ -117,11 +120,13 @@ public void removeLoggerRepositoryEventListener( LoggerRepositoryEventListener listener) { - if(!repositoryEventListeners.contains(listener)) { - LogLog.warn( - "Ignoring attempt to remove a non-registered LoggerRepositoryEventListener."); - } else { - repositoryEventListeners.remove(listener); + synchronized(repositoryEventListeners) { + if(!repositoryEventListeners.contains(listener)) { + LogLog.warn( + "Ignoring attempt to remove a non-registered LoggerRepositoryEventListener."); + } else { + repositoryEventListeners.remove(listener); + } } } @@ -130,11 +135,13 @@ will be called when repository events occur. @since 1.3*/ public void addLoggerEventListener(LoggerEventListener listener) { - if(loggerEventListeners.contains(listener)) { - LogLog.warn( - "Ignoring attempt to add a previously registerd LoggerEventListener."); - } else { - loggerEventListeners.addElement(listener); + synchronized(loggerEventListeners) { + if(loggerEventListeners.contains(listener)) { + LogLog.warn( + "Ignoring attempt to add a previously registerd LoggerEventListener."); + } else { + loggerEventListeners.add(listener); + } } } @@ -142,12 +149,13 @@ Remove a {@link LoggerEventListener} from the repository. @since 1.3*/ public void removeLoggerEventListener(LoggerEventListener listener) { - - if(!loggerEventListeners.contains(listener)) { - LogLog.warn( - "Ignoring attempt to remove a non-registered LoggerEventListener."); - } else { - loggerEventListeners.remove(listener); + synchronized(loggerEventListeners) { + if(!loggerEventListeners.contains(listener)) { + LogLog.warn( + "Ignoring attempt to remove a non-registered LoggerEventListener."); + } else { + loggerEventListeners.remove(listener); + } } } @@ -223,13 +231,10 @@ @param appender The appender added to the logger. @since 1.3*/ public void fireAddAppenderEvent(Logger logger, Appender appender) { - if(loggerEventListeners != null) { - int size = loggerEventListeners.size(); - LoggerEventListener listener; - for(int i = 0; i < size; i++) { - listener = (LoggerEventListener)loggerEventListeners.elementAt(i); - listener.appenderAddedEvent(logger, appender); - } + ArrayList list = copyListenerList(loggerEventListeners); + int size = list.size(); + for(int i = 0; i < size; i++) { + ((LoggerEventListener)list.get(i)).appenderAddedEvent(logger, appender); } } @@ -240,13 +245,10 @@ @param appender The appender removed from the logger. @since 1.3*/ public void fireRemoveAppenderEvent(Logger logger, Appender appender) { - if(loggerEventListeners != null) { - int size = loggerEventListeners.size(); - LoggerEventListener listener; - for(int i = 0; i < size; i++) { - listener = (LoggerEventListener)loggerEventListeners.elementAt(i); - listener.appenderRemovedEvent(logger, appender); - } + ArrayList list = copyListenerList(loggerEventListeners); + int size = list.size(); + for(int i = 0; i < size; i++) { + ((LoggerEventListener)list.get(i)).appenderRemovedEvent(logger, appender); } } @@ -256,13 +258,10 @@ @param logger The logger which changed levels. @since 1.3*/ public void fireLevelChangedEvent(Logger logger) { - if(loggerEventListeners != null) { - int size = loggerEventListeners.size(); - LoggerEventListener listener; - for(int i = 0; i < size; i++) { - listener = (LoggerEventListener)loggerEventListeners.elementAt(i); - listener.levelChangedEvent(logger); - } + ArrayList list = copyListenerList(loggerEventListeners); + int size = list.size(); + for(int i = 0; i < size; i++) { + ((LoggerEventListener)list.get(i)).levelChangedEvent(logger); } } @@ -271,18 +270,27 @@ {@link LoggerRepositoryEventListener}. @since 1.3*/ public void fireConfigurationChangedEvent() { - if(repositoryEventListeners != null) { - int size = repositoryEventListeners.size(); - LoggerRepositoryEventListener listener; - for(int i = 0; i < size; i++) { - listener = (LoggerRepositoryEventListener) - repositoryEventListeners.elementAt(i); - listener.configurationChangedEvent(this); - } + ArrayList list = copyListenerList(repositoryEventListeners); + int size = list.size(); + for(int i = 0; i < size; i++) { + ((LoggerRepositoryEventListener)list.get(i)).configurationChangedEvent(this); } } /** + Returns a copy of the given listener vector. */ + private ArrayList copyListenerList(ArrayList list) { + ArrayList listCopy = null; + synchronized(list) { + int size = list.size(); + listCopy = new ArrayList(size); + for (int x = 0; x < size; x++) { + listCopy.add(list.get(x)); + } + } + return listCopy; + } + /** Returns a {@link Level} representation of the <code>enable</code> state. @@ -456,14 +464,10 @@ rendererMap.clear(); // inform the listeners that the configuration has been reset - if(repositoryEventListeners != null) { - int size = repositoryEventListeners.size(); - LoggerRepositoryEventListener listener; - for(int i = 0; i < size; i++) { - listener = - (LoggerRepositoryEventListener)repositoryEventListeners.elementAt(i); - listener.configurationResetEvent(this); - } + ArrayList list = copyListenerList(repositoryEventListeners); + int size = list.size(); + for(int i = 0; i < size; i++) { + ((LoggerRepositoryEventListener)list.get(i)).configurationResetEvent(this); } } @@ -498,14 +502,10 @@ // let listeners know about shutdown if this is // not being done as part of a reset. if (!doingReset) { - if(repositoryEventListeners != null) { - int size = repositoryEventListeners.size(); - LoggerRepositoryEventListener listener; - for(int i = 0; i < size; i++) { - listener = - (LoggerRepositoryEventListener)repositoryEventListeners.elementAt(i); - listener.shutdownEvent(this); - } + ArrayList list = copyListenerList(repositoryEventListeners); + int size = list.size(); + for(int i = 0; i < size; i++) { + ((LoggerRepositoryEventListener)list.get(i)).shutdownEvent(this); } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>