You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/08/23 11:00:32 UTC

svn commit: r1516756 - /tomcat/trunk/java/org/apache/catalina/tribes/membership/McastServiceImpl.java

Author: markt
Date: Fri Aug 23 09:00:31 2013
New Revision: 1516756

URL: http://svn.apache.org/r1516756
Log:
Ensure that there is only ever one recovery thread running at a time.
It was pretty much impossible for this to happen with the previous code but there was a very small window where two threads could have been started. This change guarantees there is only ever one recovery thread.

Modified:
    tomcat/trunk/java/org/apache/catalina/tribes/membership/McastServiceImpl.java

Modified: tomcat/trunk/java/org/apache/catalina/tribes/membership/McastServiceImpl.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/membership/McastServiceImpl.java?rev=1516756&r1=1516755&r2=1516756&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/tribes/membership/McastServiceImpl.java (original)
+++ tomcat/trunk/java/org/apache/catalina/tribes/membership/McastServiceImpl.java Fri Aug 23 09:00:31 2013
@@ -28,6 +28,7 @@ import java.net.SocketTimeoutException;
 import java.util.Arrays;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.catalina.tribes.Channel;
 import org.apache.catalina.tribes.Member;
@@ -580,14 +581,18 @@ public class McastServiceImpl
     }//class SenderThread
 
     protected static class RecoveryThread extends Thread {
-        static volatile boolean running = false;
+
+        private static final AtomicBoolean running = new AtomicBoolean(false);
 
         public static synchronized void recover(McastServiceImpl parent) {
-            if (running) return;
-            if (!parent.isRecoveryEnabled())
+
+            if (!parent.isRecoveryEnabled()) {
                 return;
+            }
 
-            running = true;
+            if (!running.compareAndSet(false, true)) {
+                return;
+            }
 
             Thread t = new RecoveryThread(parent);
 
@@ -644,7 +649,7 @@ public class McastServiceImpl
                     }
                 }
             }finally {
-                running = false;
+                running.set(false);
             }
         }
     }



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