You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by re...@apache.org on 2010/10/09 10:24:20 UTC

svn commit: r1006115 - /harmony/enhanced/java/trunk/classlib/modules/logging/src/main/java/java/util/logging/LogManager.java

Author: regisxu
Date: Sat Oct  9 08:24:19 2010
New Revision: 1006115

URL: http://svn.apache.org/viewvc?rev=1006115&view=rev
Log:
Performance improvement for LogManager.addToFamilyTree

If parent is not root, do not need to travel all loggers.

Modified:
    harmony/enhanced/java/trunk/classlib/modules/logging/src/main/java/java/util/logging/LogManager.java

Modified: harmony/enhanced/java/trunk/classlib/modules/logging/src/main/java/java/util/logging/LogManager.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/logging/src/main/java/java/util/logging/LogManager.java?rev=1006115&r1=1006114&r2=1006115&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/logging/src/main/java/java/util/logging/LogManager.java (original)
+++ harmony/enhanced/java/trunk/classlib/modules/logging/src/main/java/java/util/logging/LogManager.java Sat Oct  9 08:24:19 2010
@@ -32,6 +32,8 @@ import java.util.Collection;
 import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Properties;
 import java.util.Set;
 import java.util.StringTokenizer;
@@ -321,26 +323,46 @@ public class LogManager {
         }
 
         // find children
-        // TODO: performance can be improved here?
-        Collection<Logger> allLoggers = loggers.values();
-        boolean emptyName = name.length() == 0;
-        String namePrefix = name + '.';
-        for (final Logger child : allLoggers) {
-            Logger oldParent = child.getParent();
-            if (parent == oldParent
-                    && (emptyName || child.getName().startsWith(namePrefix))) {
-                final Logger thisLogger = logger;
-                AccessController.doPrivileged(new PrivilegedAction<Object>() {
+        final boolean isNameEmpty = (name.length() == 0);
+        final Logger thisLogger = logger;
+        final String namePrefix = isNameEmpty ? "" : name + '.';
+        /*
+         * find only children under the current parent (others can
+         * not be children of the new logger)
+         */
+        if (parent == null) {
+            // parent is root, need to check all loggers to find children.
+            final Collection<Logger> allLoggers = loggers.values();
+            AccessController
+                    .doPrivileged(new PrivilegedAction<Object>() {
+                        public Object run() {
+                            for (final Logger child : allLoggers) {
+                                if (null == child.getParent()
+                                        && (child.getName().startsWith(namePrefix))) {
+                                    child.setParent(thisLogger);
+                                }
+                            }
+                            return null;
+                        }
+            });
+        } else {
+            final List<Logger> childs = parent.children;
+            final Logger oldParent = parent;
+            AccessController.doPrivileged(new PrivilegedAction<Object>() {
                     public Object run() {
-                        child.setParent(thisLogger);
+                        final List toBeRemoved = new LinkedList();
+                        for (final Logger element : childs) {
+                            final String elementName = element.getName();
+                            if (elementName != null && elementName.startsWith(namePrefix)) {
+                                element.setParent(thisLogger);
+                                toBeRemoved.add(element);
+                            }
+                        }
+                        // remove child as the parent has been changed
+                        oldParent.children.removeAll(toBeRemoved);
                         return null;
                     }
                 });
-                if (null != oldParent) {
-                    // -- remove from old parent as the parent has been changed
-                    oldParent.children.remove(child);
-                }
-            }
         }
     }