You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by el...@apache.org on 2011/04/08 21:33:43 UTC

svn commit: r1090411 - /mina/branches/2.0.3/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingConnectionlessIoAcceptor.java

Author: elecharny
Date: Fri Apr  8 19:33:43 2011
New Revision: 1090411

URL: http://svn.apache.org/viewvc?rev=1090411&view=rev
Log:
Adapted the patch from DIRMINA-819 to the UDP Acceptor

Modified:
    mina/branches/2.0.3/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingConnectionlessIoAcceptor.java

Modified: mina/branches/2.0.3/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingConnectionlessIoAcceptor.java
URL: http://svn.apache.org/viewvc/mina/branches/2.0.3/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingConnectionlessIoAcceptor.java?rev=1090411&r1=1090410&r2=1090411&view=diff
==============================================================================
--- mina/branches/2.0.3/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingConnectionlessIoAcceptor.java (original)
+++ mina/branches/2.0.3/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingConnectionlessIoAcceptor.java Fri Apr  8 19:33:43 2011
@@ -35,6 +35,7 @@ import java.util.Queue;
 import java.util.Set;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.mina.core.RuntimeIoException;
 import org.apache.mina.core.buffer.IoBuffer;
@@ -88,7 +89,7 @@ public abstract class AbstractPollingCon
     private volatile boolean selectable;
 
     /** The thread responsible of accepting incoming requests */
-    private Acceptor acceptor;
+    private AtomicReference<Acceptor> acceptorRef = new AtomicReference<Acceptor>();
 
     private long lastIdleCheckTime;
 
@@ -365,9 +366,12 @@ public abstract class AbstractPollingCon
             flushingSessions.clear();
         }
 
-        synchronized (lock) {
-            if (acceptor == null) {
-                acceptor = new Acceptor();
+        Acceptor acceptor = acceptorRef.get();
+
+        if (acceptor == null) {
+            acceptor = new Acceptor();
+
+            if (acceptorRef.compareAndSet(null, acceptor)) {
                 executeWorker(acceptor);
             }
         }
@@ -414,7 +418,7 @@ public abstract class AbstractPollingCon
                     if (nHandles == 0) {
                         synchronized (lock) {
                             if (registerQueue.isEmpty() && cancelQueue.isEmpty()) {
-                                acceptor = null;
+                                acceptorRef.set(null);
                                 break;
                             }
                         }