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);