Author: markt
Date: Fri Sep 18 08:50:33 2015
New Revision: 1703772

URL: http://svn.apache.org/viewvc?rev=1703772&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=58398
Simplify the code and fix a data race (listeners should have been volatile)

Modified:
    tomcat/trunk/java/org/apache/catalina/util/LifecycleBase.java

Modified: tomcat/trunk/java/org/apache/catalina/util/LifecycleBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/LifecycleBase.java?rev=1703772&r1=1703771&r2=1703772&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/util/LifecycleBase.java (original)
+++ tomcat/trunk/java/org/apache/catalina/util/LifecycleBase.java Fri Sep 18 
08:50:33 2015
@@ -17,6 +17,9 @@
 
 package org.apache.catalina.util;
 
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
 import org.apache.catalina.Lifecycle;
 import org.apache.catalina.LifecycleEvent;
 import org.apache.catalina.LifecycleException;
@@ -41,11 +44,9 @@ public abstract class LifecycleBase impl
 
 
     /**
-     * The set of registered LifecycleListeners for event notifications.
+     * The list of registered LifecycleListeners for event notifications.
      */
-    private LifecycleListener listeners[] = new LifecycleListener[0];
-
-    private final Object listenersLock = new Object(); // Lock object for 
changes to listeners
+    private final List<LifecycleListener> listeners = new 
CopyOnWriteArrayList<>();
 
 
     /**
@@ -59,14 +60,7 @@ public abstract class LifecycleBase impl
      */
     @Override
     public void addLifecycleListener(LifecycleListener listener) {
-        synchronized (listenersLock) {
-            LifecycleListener results[] = new 
LifecycleListener[listeners.length + 1];
-            for (int i = 0; i < listeners.length; i++) {
-                results[i] = listeners[i];
-            }
-            results[listeners.length] = listener;
-            listeners = results;
-        }
+        listeners.add(listener);
     }
 
 
@@ -75,7 +69,7 @@ public abstract class LifecycleBase impl
      */
     @Override
     public LifecycleListener[] findLifecycleListeners() {
-        return listeners;
+        return listeners.toArray(new LifecycleListener[0]);
     }
 
 
@@ -84,26 +78,7 @@ public abstract class LifecycleBase impl
      */
     @Override
     public void removeLifecycleListener(LifecycleListener listener) {
-        synchronized (listenersLock) {
-            int n = -1;
-            for (int i = 0; i < listeners.length; i++) {
-                if (listeners[i] == listener) {
-                    n = i;
-                    break;
-                }
-            }
-            if (n < 0) {
-                return;
-            }
-            LifecycleListener results[] = new 
LifecycleListener[listeners.length - 1];
-            int j = 0;
-            for (int i = 0; i < listeners.length; i++) {
-                if (i != n) {
-                    results[j++] = listeners[i];
-                }
-            }
-            listeners = results;
-        }
+        listeners.remove(listener);
     }
 
 
@@ -115,9 +90,8 @@ public abstract class LifecycleBase impl
      */
     protected void fireLifecycleEvent(String type, Object data) {
         LifecycleEvent event = new LifecycleEvent(this, type, data);
-        LifecycleListener interested[] = listeners;
-        for (int i = 0; i < interested.length; i++) {
-            interested[i].lifecycleEvent(event);
+        for (LifecycleListener listener : listeners) {
+            listener.lifecycleEvent(event);
         }
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to