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