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 2010/02/10 23:03:56 UTC

svn commit: r908669 - in /mina/trunk/core/src/main/java/org/apache/mina: core/polling/AbstractPollingIoProcessor.java transport/socket/nio/NioProcessor.java

Author: elecharny
Date: Wed Feb 10 22:03:55 2010
New Revision: 908669

URL: http://svn.apache.org/viewvc?rev=908669&view=rev
Log:
Fix for DIRMINA-762

Modified:
    mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
    mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioProcessor.java

Modified: mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java?rev=908669&r1=908668&r2=908669&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java Wed Feb 10 22:03:55 2010
@@ -1064,35 +1064,39 @@
                     long t1 = System.currentTimeMillis();
                     long delta = (t1 - t0);
 
-                    synchronized (wakeupCalled) {
-                        if ((selected == 0) && !wakeupCalled.get() && (delta < 100)) {
-                            // Last chance : the select() may have been
-                            // interrupted because we have had an closed channel.
-                            if (isBrokenConnection()) {
-                                // we can reselect immediately
-                                continue;
-                            } else {
-                                LOG.warn("Create a new selector. Selected is 0, delta = "
-                                                + (t1 - t0));
-                                // Ok, we are hit by the nasty epoll
-                                // spinning.
-                                // Basically, there is a race condition
-                                // which causes a closing file descriptor not to be
-                                // considered as available as a selected channel, but
-                                // it stopped the select. The next time we will
-                                // call select(), it will exit immediately for the same
-                                // reason, and do so forever, consuming 100%
-                                // CPU.
-                                // We have to destroy the selector, and
-                                // register all the socket on a new one.
-                                registerNewSelector();
-                            }
+                    if ((selected == 0) && !wakeupCalled.get() && (delta < 100)) {
+                        // Last chance : the select() may have been
+                        // interrupted because we have had an closed channel.
+                        if (isBrokenConnection()) {
+                            LOG.warn("Broken connection");
+
+                            // we can reselect immediately
+                            // set back the flag to false
+                            wakeupCalled.getAndSet(false);
 
-                            // and continue the loop
                             continue;
+                        } else {
+                            LOG.warn("Create a new selector. Selected is 0, delta = "
+                                            + (t1 - t0));
+                            // Ok, we are hit by the nasty epoll
+                            // spinning.
+                            // Basically, there is a race condition
+                            // which causes a closing file descriptor not to be
+                            // considered as available as a selected channel, but
+                            // it stopped the select. The next time we will
+                            // call select(), it will exit immediately for the same
+                            // reason, and do so forever, consuming 100%
+                            // CPU.
+                            // We have to destroy the selector, and
+                            // register all the socket on a new one.
+                            registerNewSelector();
                         }
 
+                        // Set back the flag to false
                         wakeupCalled.getAndSet(false);
+                        
+                        // and continue the loop
+                        continue;
                     }
 
                     // Manage newly created session first

Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioProcessor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioProcessor.java?rev=908669&r1=908668&r2=908669&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioProcessor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioProcessor.java Wed Feb 10 22:03:55 2010
@@ -43,7 +43,7 @@
  */
 public final class NioProcessor extends AbstractPollingIoProcessor<NioSession> {
     /** The selector associated with this processor */
-    private volatile Selector selector;
+    private Selector selector;
 
     /**
      * 
@@ -84,10 +84,8 @@
 
     @Override
     protected void wakeup() {
-        synchronized (wakeupCalled) {
-            wakeupCalled.getAndSet(true);
-            selector.wakeup();
-        }
+        wakeupCalled.getAndSet(true);
+        selector.wakeup();
     }
 
     @Override