Browse Source

Enhance performance of Project.fireMessageLoggedEvent (PR 45651)

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@687068 13f79535-47bb-0310-9956-ffa450edef68
master
Scokart Gilles 17 years ago
parent
commit
695ce2ed1c
3 changed files with 67 additions and 52 deletions
  1. +3
    -0
      WHATSNEW
  2. +4
    -0
      contributors.xml
  3. +60
    -52
      src/main/org/apache/tools/ant/Project.java

+ 3
- 0
WHATSNEW View File

@@ -157,6 +157,9 @@ Fixed bugs:
* <filterset> sometimes incorrectly flagged infinite recursions of * <filterset> sometimes incorrectly flagged infinite recursions of
filter tokens filter tokens
Bugzilla Report 44226. Bugzilla Report 44226.
* Enhance performance of Project.fireMessageLoggedEvent
Bugzilla Report 45651.


Other changes: Other changes:
-------------- --------------


+ 4
- 0
contributors.xml View File

@@ -417,6 +417,10 @@
<first>Gerrit</first> <first>Gerrit</first>
<last>Riessen</last> <last>Riessen</last>
</name> </name>
<name>
<first>Gilles</first>
<last>Scokart</last>
</name>
<name> <name>
<first>Glenn</first> <first>Glenn</first>
<last>McAllister</last> <last>McAllister</last>


+ 60
- 52
src/main/org/apache/tools/ant/Project.java View File

@@ -26,7 +26,6 @@ import java.lang.reflect.Modifier;
import java.util.Collections; import java.util.Collections;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Iterator;
import java.util.Properties; import java.util.Properties;
import java.util.Stack; import java.util.Stack;
import java.util.Vector; import java.util.Vector;
@@ -170,7 +169,7 @@ public class Project implements ResourceFactory {
private final Object listenersLock = new Object(); private final Object listenersLock = new Object();


/** List of listeners to notify of build events. */ /** 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 /** for each thread, record whether it is currently executing
messageLogged */ messageLogged */
@@ -387,12 +386,15 @@ public class Project implements ResourceFactory {
public void addBuildListener(BuildListener listener) { public void addBuildListener(BuildListener listener) {
synchronized (listenersLock) { synchronized (listenersLock) {
// If the listeners already has this listener, do nothing // 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 // 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; listeners = newListeners;
} }
} }
@@ -407,19 +409,31 @@ public class Project implements ResourceFactory {
public void removeBuildListener(BuildListener listener) { public void removeBuildListener(BuildListener listener) {
synchronized (listenersLock) { synchronized (listenersLock) {
// copy on write semantics // 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() { 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 class Project implements ResourceFactory {
*/ */
public void fireBuildStarted() { public void fireBuildStarted() {
BuildEvent event = new BuildEvent(this); 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 class Project implements ResourceFactory {
public void fireBuildFinished(Throwable exception) { public void fireBuildFinished(Throwable exception) {
BuildEvent event = new BuildEvent(this); BuildEvent event = new BuildEvent(this);
event.setException(exception); 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 // Inform IH to clear the cache
IntrospectionHelper.clearCache(); IntrospectionHelper.clearCache();
@@ -2020,11 +2032,10 @@ public class Project implements ResourceFactory {
*/ */
public void fireSubBuildStarted() { public void fireSubBuildStarted() {
BuildEvent event = new BuildEvent(this); 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 class Project implements ResourceFactory {
public void fireSubBuildFinished(Throwable exception) { public void fireSubBuildFinished(Throwable exception) {
BuildEvent event = new BuildEvent(this); BuildEvent event = new BuildEvent(this);
event.setException(exception); 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 @@ public class Project implements ResourceFactory {
*/ */
protected void fireTargetStarted(Target target) { protected void fireTargetStarted(Target target) {
BuildEvent event = new BuildEvent(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 @@ public class Project implements ResourceFactory {
protected void fireTargetFinished(Target target, Throwable exception) { protected void fireTargetFinished(Target target, Throwable exception) {
BuildEvent event = new BuildEvent(target); BuildEvent event = new BuildEvent(target);
event.setException(exception); 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 @@ public class Project implements ResourceFactory {
// register this as the current task on the current thread. // register this as the current task on the current thread.
registerThreadTask(Thread.currentThread(), task); registerThreadTask(Thread.currentThread(), task);
BuildEvent event = new BuildEvent(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 @@ public class Project implements ResourceFactory {
System.err.flush(); System.err.flush();
BuildEvent event = new BuildEvent(task); BuildEvent event = new BuildEvent(task);
event.setException(exception); 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 @@ public class Project implements ResourceFactory {
} }
try { try {
isLoggingMessage.set(Boolean.TRUE); 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 { } finally {
isLoggingMessage.set(Boolean.FALSE); isLoggingMessage.set(Boolean.FALSE);


Loading…
Cancel
Save