Browse Source

Switch BuildListener management from "copy on each event" to "copy on

add/remove".

Suggested by:	Sylvain Wallez <sylvain dot wallez at anyware dash tech dot com>


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@275138 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 22 years ago
parent
commit
24179ae7dd
1 changed files with 34 additions and 32 deletions
  1. +34
    -32
      src/main/org/apache/tools/ant/Project.java

+ 34
- 32
src/main/org/apache/tools/ant/Project.java View File

@@ -62,6 +62,7 @@ import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
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;
@@ -371,8 +372,12 @@ public class Project {
* @param listener The listener to add to the list. * @param listener The listener to add to the list.
* Must not be <code>null</code>. * Must not be <code>null</code>.
*/ */
public void addBuildListener(BuildListener listener) {
listeners.addElement(listener);
public synchronized void addBuildListener(BuildListener listener) {
// create a new Vector to avoid ConcurrentModificationExc when
// the listeners get added/removed while we are in fire
Vector newListeners = getBuildListeners();
newListeners.addElement(listener);
listeners = newListeners;
} }


/** /**
@@ -383,11 +388,15 @@ public class Project {
* Should not be <code>null</code>. * Should not be <code>null</code>.
*/ */
public void removeBuildListener(BuildListener listener) { public void removeBuildListener(BuildListener listener) {
listeners.removeElement(listener);
// create a new Vector to avoid ConcurrentModificationExc when
// the listeners get added/removed while we are in fire
Vector newListeners = getBuildListeners();
newListeners.removeElement(listener);
listeners = newListeners;
} }


/** /**
* Returns a list of build listeners for the project.
* Returns a copy of the list of build listeners for the project.
* *
* @return a list of build listeners for the project * @return a list of build listeners for the project
*/ */
@@ -1800,10 +1809,9 @@ public class Project {
*/ */
public void fireBuildStarted() { public void fireBuildStarted() {
BuildEvent event = new BuildEvent(this); BuildEvent event = new BuildEvent(this);
Vector listeners = getBuildListeners();
int size = listeners.size();
for (int i = 0; i < size; i++) {
BuildListener listener = (BuildListener) listeners.elementAt(i);
Iterator iter = listeners.iterator();
while (iter.hasNext()) {
BuildListener listener = (BuildListener) iter.next();
listener.buildStarted(event); listener.buildStarted(event);
} }
} }
@@ -1817,10 +1825,9 @@ public class Project {
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);
Vector listeners = getBuildListeners();
int size = listeners.size();
for (int i = 0; i < size; i++) {
BuildListener listener = (BuildListener) listeners.elementAt(i);
Iterator iter = listeners.iterator();
while (iter.hasNext()) {
BuildListener listener = (BuildListener) iter.next();
listener.buildFinished(event); listener.buildFinished(event);
} }
} }
@@ -1834,10 +1841,9 @@ public class Project {
*/ */
protected void fireTargetStarted(Target target) { protected void fireTargetStarted(Target target) {
BuildEvent event = new BuildEvent(target); BuildEvent event = new BuildEvent(target);
Vector listeners = getBuildListeners();
int size = listeners.size();
for (int i = 0; i < size; i++) {
BuildListener listener = (BuildListener) listeners.elementAt(i);
Iterator iter = listeners.iterator();
while (iter.hasNext()) {
BuildListener listener = (BuildListener) iter.next();
listener.targetStarted(event); listener.targetStarted(event);
} }
} }
@@ -1855,10 +1861,9 @@ public class Project {
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);
Vector listeners = getBuildListeners();
int size = listeners.size();
for (int i = 0; i < size; i++) {
BuildListener listener = (BuildListener) listeners.elementAt(i);
Iterator iter = listeners.iterator();
while (iter.hasNext()) {
BuildListener listener = (BuildListener) iter.next();
listener.targetFinished(event); listener.targetFinished(event);
} }
} }
@@ -1873,10 +1878,9 @@ public class Project {
// 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);
Vector listeners = getBuildListeners();
int size = listeners.size();
for (int i = 0; i < size; i++) {
BuildListener listener = (BuildListener) listeners.elementAt(i);
Iterator iter = listeners.iterator();
while (iter.hasNext()) {
BuildListener listener = (BuildListener) iter.next();
listener.taskStarted(event); listener.taskStarted(event);
} }
} }
@@ -1897,10 +1901,9 @@ public class Project {
System.err.flush(); System.err.flush();
BuildEvent event = new BuildEvent(task); BuildEvent event = new BuildEvent(task);
event.setException(exception); event.setException(exception);
Vector listeners = getBuildListeners();
int size = listeners.size();
for (int i = 0; i < size; i++) {
BuildListener listener = (BuildListener) listeners.elementAt(i);
Iterator iter = listeners.iterator();
while (iter.hasNext()) {
BuildListener listener = (BuildListener) iter.next();
listener.taskFinished(event); listener.taskFinished(event);
} }
} }
@@ -1924,7 +1927,6 @@ public class Project {
} else { } else {
event.setMessage(message, priority); event.setMessage(message, priority);
} }
Vector listeners = getBuildListeners();
synchronized (this) { synchronized (this) {
if (loggingMessage) { if (loggingMessage) {
throw new BuildException("Listener attempted to access " throw new BuildException("Listener attempted to access "
@@ -1933,9 +1935,9 @@ public class Project {
} }
try { try {
loggingMessage = true; loggingMessage = true;
int size = listeners.size();
for (int i = 0; i < size; i++) {
BuildListener listener = (BuildListener) listeners.elementAt(i);
Iterator iter = listeners.iterator();
while (iter.hasNext()) {
BuildListener listener = (BuildListener) iter.next();
listener.messageLogged(event); listener.messageLogged(event);
} }
} finally { } finally {


Loading…
Cancel
Save