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: [email protected]
For additional commands, e-mail: [email protected]