Author: gscokart
Date: Tue Aug 19 07:58:13 2008
New Revision: 687068

URL: http://svn.apache.org/viewvc?rev=687068&view=rev
Log:
Enhance performance of Project.fireMessageLoggedEvent (PR 45651)

Modified:
    ant/core/trunk/WHATSNEW
    ant/core/trunk/contributors.xml
    ant/core/trunk/src/main/org/apache/tools/ant/Project.java

Modified: ant/core/trunk/WHATSNEW
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=687068&r1=687067&r2=687068&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Tue Aug 19 07:58:13 2008
@@ -157,6 +157,9 @@
  * <filterset> sometimes incorrectly flagged infinite recursions of
    filter tokens
    Bugzilla Report 44226.
+   
+ * Enhance performance of Project.fireMessageLoggedEvent  
+   Bugzilla Report 45651.
 
 Other changes:
 --------------

Modified: ant/core/trunk/contributors.xml
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/contributors.xml?rev=687068&r1=687067&r2=687068&view=diff
==============================================================================
--- ant/core/trunk/contributors.xml (original)
+++ ant/core/trunk/contributors.xml Tue Aug 19 07:58:13 2008
@@ -418,6 +418,10 @@
     <last>Riessen</last>
   </name>
   <name>
+    <first>Gilles</first>
+    <last>Scokart</last>
+  </name>
+  <name>
     <first>Glenn</first>
     <last>McAllister</last>
   </name>

Modified: ant/core/trunk/src/main/org/apache/tools/ant/Project.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/Project.java?rev=687068&r1=687067&r2=687068&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/Project.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/Project.java Tue Aug 19 
07:58:13 2008
@@ -26,7 +26,6 @@
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.Hashtable;
-import java.util.Iterator;
 import java.util.Properties;
 import java.util.Stack;
 import java.util.Vector;
@@ -170,7 +169,7 @@
     private final Object listenersLock = new Object();
 
     /** List of listeners to notify of build events. */
-    private Vector listeners = new Vector();
+    private volatile BuildListener[] listeners = new BuildListener[0];
 
     /** for each thread, record whether it is currently executing
         messageLogged */
@@ -387,12 +386,15 @@
     public void addBuildListener(BuildListener listener) {
         synchronized (listenersLock) {
             // If the listeners already has this listener, do nothing
-            if (listeners.contains(listener)) {
-                return;
+            for (int i = 0; i < listeners.length; i++) {
+                if (listeners[i] == listener) {
+                    return;
+                }
             }
             // copy on write semantics
-            Vector newListeners = getBuildListeners();
-            newListeners.addElement(listener);
+            BuildListener[] newListeners = new BuildListener[listeners.length 
+ 1];
+            System.arraycopy(listeners, 0, newListeners, 0, listeners.length);
+            newListeners[listeners.length] = listener;
             listeners = newListeners;
         }
     }
@@ -407,19 +409,31 @@
     public void removeBuildListener(BuildListener listener) {
         synchronized (listenersLock) {
             // copy on write semantics
-            Vector newListeners = getBuildListeners();
-            newListeners.removeElement(listener);
-            listeners = newListeners;
+            for (int i = 0; i < listeners.length; i++) {
+                if (listeners[i] == listener) {
+                    BuildListener[] newListeners = new 
BuildListener[listeners.length - 1];
+                    System.arraycopy(listeners, 0, newListeners, 0, i);
+                    System.arraycopy(listeners, i + 1, newListeners, i, 
listeners.length - i - 1);
+                    listeners = newListeners;
+                    break;
+                }
+            }
         }
     }
 
     /**
-     * Return a copy of the list of build listeners for the project.
-     *
-     * @return a list of build listeners for the project
-     */
+        * Return a copy of the list of build listeners for the project.
+        * 
+        * @return a list of build listeners for the project
+        */
     public Vector getBuildListeners() {
-        return (Vector) listeners.clone();
+        synchronized (listenersLock) {
+            Vector r = new Vector(listeners.length);
+            for (int i = 0; i < listeners.length; i++) {
+                r.add(listeners[i]);
+            }
+            return r;
+        }
     }
 
     /**
@@ -1986,10 +2000,9 @@
      */
     public void fireBuildStarted() {
         BuildEvent event = new BuildEvent(this);
-        Iterator iter = listeners.iterator();
-        while (iter.hasNext()) {
-            BuildListener listener = (BuildListener) iter.next();
-            listener.buildStarted(event);
+        BuildListener[] currListeners = listeners;
+        for (int i=0; i<currListeners.length; i++) {
+               currListeners[i].buildStarted(event);
         }
     }
 
@@ -2003,10 +2016,9 @@
     public void fireBuildFinished(Throwable exception) {
         BuildEvent event = new BuildEvent(this);
         event.setException(exception);
-        Iterator iter = listeners.iterator();
-        while (iter.hasNext()) {
-            BuildListener listener = (BuildListener) iter.next();
-            listener.buildFinished(event);
+        BuildListener[] currListeners = listeners;
+        for (int i=0; i<currListeners.length; i++) {
+               currListeners[i].buildFinished(event);
         }
         // Inform IH to clear the cache
         IntrospectionHelper.clearCache();
@@ -2020,11 +2032,10 @@
      */
     public void fireSubBuildStarted() {
         BuildEvent event = new BuildEvent(this);
-        Iterator iter = listeners.iterator();
-        while (iter.hasNext()) {
-            Object listener = iter.next();
-            if (listener instanceof SubBuildListener) {
-                ((SubBuildListener) listener).subBuildStarted(event);
+        BuildListener[] currListeners = listeners;
+        for (int i=0; i<currListeners.length; i++) {
+               if (currListeners[i] instanceof SubBuildListener) {
+                ((SubBuildListener) currListeners[i]).subBuildStarted(event);
             }
         }
     }
@@ -2041,11 +2052,10 @@
     public void fireSubBuildFinished(Throwable exception) {
         BuildEvent event = new BuildEvent(this);
         event.setException(exception);
-        Iterator iter = listeners.iterator();
-        while (iter.hasNext()) {
-            Object listener = iter.next();
-            if (listener instanceof SubBuildListener) {
-                ((SubBuildListener) listener).subBuildFinished(event);
+        BuildListener[] currListeners = listeners;
+        for (int i=0; i<currListeners.length; i++) {
+               if (currListeners[i] instanceof SubBuildListener) {
+                ((SubBuildListener) currListeners[i]).subBuildFinished(event);
             }
         }
     }
@@ -2059,11 +2069,11 @@
      */
     protected void fireTargetStarted(Target target) {
         BuildEvent event = new BuildEvent(target);
-        Iterator iter = listeners.iterator();
-        while (iter.hasNext()) {
-            BuildListener listener = (BuildListener) iter.next();
-            listener.targetStarted(event);
+        BuildListener[] currListeners = listeners;
+        for (int i=0; i<currListeners.length; i++) {
+               currListeners[i].targetStarted(event);
         }
+
     }
 
     /**
@@ -2079,11 +2089,11 @@
     protected void fireTargetFinished(Target target, Throwable exception) {
         BuildEvent event = new BuildEvent(target);
         event.setException(exception);
-        Iterator iter = listeners.iterator();
-        while (iter.hasNext()) {
-            BuildListener listener = (BuildListener) iter.next();
-            listener.targetFinished(event);
+        BuildListener[] currListeners = listeners;
+        for (int i=0; i<currListeners.length; i++) {
+               currListeners[i].targetFinished(event);
         }
+
     }
 
     /**
@@ -2097,10 +2107,9 @@
         // register this as the current task on the current thread.
         registerThreadTask(Thread.currentThread(), task);
         BuildEvent event = new BuildEvent(task);
-        Iterator iter = listeners.iterator();
-        while (iter.hasNext()) {
-            BuildListener listener = (BuildListener) iter.next();
-            listener.taskStarted(event);
+        BuildListener[] currListeners = listeners;
+        for (int i=0; i<currListeners.length; i++) {
+               currListeners[i].taskStarted(event);
         }
     }
 
@@ -2120,11 +2129,11 @@
         System.err.flush();
         BuildEvent event = new BuildEvent(task);
         event.setException(exception);
-        Iterator iter = listeners.iterator();
-        while (iter.hasNext()) {
-            BuildListener listener = (BuildListener) iter.next();
-            listener.taskFinished(event);
+        BuildListener[] currListeners = listeners;
+        for (int i=0; i<currListeners.length; i++) {
+               currListeners[i].targetFinished(event);
         }
+
     }
 
     /**
@@ -2165,10 +2174,9 @@
         }
         try {
             isLoggingMessage.set(Boolean.TRUE);
-            Iterator iter = listeners.iterator();
-            while (iter.hasNext()) {
-                BuildListener listener = (BuildListener) iter.next();
-                listener.messageLogged(event);
+            BuildListener[] currListeners = listeners;
+            for (int i=0; i<currListeners.length; i++) {
+               currListeners[i].messageLogged(event);
             }
         } finally {
             isLoggingMessage.set(Boolean.FALSE);


Reply via email to