Author: markt Date: Fri Sep 18 08:56:11 2015 New Revision: 1703778 URL: http://svn.apache.org/viewvc?rev=1703778&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/tc8.0.x/trunk/java/org/apache/catalina/util/LifecycleSupport.java tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Modified: tomcat/tc8.0.x/trunk/java/org/apache/catalina/util/LifecycleSupport.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/util/LifecycleSupport.java?rev=1703778&r1=1703777&r2=1703778&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/catalina/util/LifecycleSupport.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/util/LifecycleSupport.java Fri Sep 18 08:56:11 2015 @@ -16,6 +16,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.LifecycleListener; @@ -52,11 +55,9 @@ public final class LifecycleSupport { /** - * 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<>(); // --------------------------------------------------------- Public Methods @@ -67,14 +68,7 @@ public final class LifecycleSupport { * @param listener The listener to add */ 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); } @@ -83,7 +77,7 @@ public final class LifecycleSupport { * Lifecycle has no listeners registered, a zero-length array is returned. */ public LifecycleListener[] findLifecycleListeners() { - return listeners; + return listeners.toArray(new LifecycleListener[0]); } @@ -97,9 +91,8 @@ public final class LifecycleSupport { */ public void fireLifecycleEvent(String type, Object data) { LifecycleEvent event = new LifecycleEvent(lifecycle, type, data); - LifecycleListener interested[] = listeners; - for (int i = 0; i < interested.length; i++) { - interested[i].lifecycleEvent(event); + for (LifecycleListener listener : listeners) { + listener.lifecycleEvent(event); } } @@ -110,24 +103,6 @@ public final class LifecycleSupport { * @param listener The listener to remove */ 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); } } Modified: tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml?rev=1703778&r1=1703777&r2=1703778&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Fri Sep 18 08:56:11 2015 @@ -104,6 +104,10 @@ <bug>58394</bug>: Fix a rare data race in Mapper when adding or removing a host. (markt) </fix> + <fix> + <bug>58398</bug>: Fix a rare data race in <code>LifecycleSupport</code>. + (markt) + </fix> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org