Author: bodewig
Date: Thu Jun 19 01:42:59 2008
New Revision: 669426

URL: http://svn.apache.org/viewvc?rev=669426&view=rev
Log:
Add a separate lock for the BuildListener collection

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

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=669426&r1=669425&r2=669426&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 Thu Jun 19 
01:42:59 2008
@@ -166,6 +166,9 @@
     /** Project base directory. */
     private File baseDir;
 
+    /** lock object used when adding/removing listeners */
+    private final Object listenersLock = new Object();
+
     /** List of listeners to notify of build events. */
     private Vector listeners = new Vector();
 
@@ -378,16 +381,17 @@
      * @param listener The listener to add to the list.
      *                 Must not be <code>null</code>.
      */
-    public synchronized void addBuildListener(BuildListener listener) {
-        // If the listeners already has this listener, do nothing
-        if (listeners.contains(listener)) {
-            return;
+    public void addBuildListener(BuildListener listener) {
+        synchronized (listenersLock) {
+            // If the listeners already has this listener, do nothing
+            if (listeners.contains(listener)) {
+                return;
+            }
+            // copy on write semantics
+            Vector newListeners = getBuildListeners();
+            newListeners.addElement(listener);
+            listeners = newListeners;
         }
-        // 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;
     }
 
     /**
@@ -397,12 +401,13 @@
      * @param listener The listener to remove from the list.
      *                 Should not be <code>null</code>.
      */
-    public synchronized void removeBuildListener(BuildListener 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;
+    public void removeBuildListener(BuildListener listener) {
+        synchronized (listenersLock) {
+            // copy on write semantics
+            Vector newListeners = getBuildListeners();
+            newListeners.removeElement(listener);
+            listeners = newListeners;
+        }
     }
 
     /**
@@ -2152,7 +2157,7 @@
                  *
                  * @see http://marc.theaimsgroup.com/?t=110538624200006&r=1&w=2
                  *
-                 * We now (Ant 1.7 and 1.6.3) simply swallow the message.
+                 * We now (Ant 1.6.3 and later) simply swallow the message.
                  */
                 return;
             }


Reply via email to