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