Author: elecharny
Date: Wed Jan 27 22:59:51 2010
New Revision: 903897

URL: http://svn.apache.org/viewvc?rev=903897&view=rev
Log:
Fixed the fix for spinning epoll : the session wasn't re-attached with the 
selectedKey when switching the selector

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=903897&r1=903896&r2=903897&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 Jan 27 22:59:51 2010
@@ -1065,47 +1065,31 @@
                     long delta = (t1 - t0);
 
                     synchronized (wakeupCalled) {
-
-                        if (selected == 0) {
-                            if (!wakeupCalled.get()) {
-                                if (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 cause
-                                        // 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();
-                                    }
-
-                                    // and continue the loop
-                                    continue;
-                                }
+                        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 {
-                                // System.out.println("Waited one second");
+                                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();
                             }
-                        } else {
-                            // System.out.println("Nb selected : " + selected);
+
+                            // and continue the loop
+                            continue;
                         }
 
                         wakeupCalled.getAndSet(false);
@@ -1113,6 +1097,7 @@
 
                     // Manage newly created session first
                     nSessions += handleNewSessions();
+                    
                     updateTrafficMask();
 
                     // Now, if we have had some incoming or outgoing events,

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=903897&r1=903896&r2=903897&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 Jan 27 22:59:51 2010
@@ -131,11 +131,17 @@
             // Open a new selector
             Selector newSelector = Selector.open();
 
+            // Loop on all the registered keys, and register them on the new 
selector
             for (SelectionKey key : keys) {
                 SelectableChannel ch = key.channel();
-                ch.register(newSelector, key.interestOps());
+                
+                // Don't forget to attache the session, and back !
+                NioSession session = (NioSession)key.attachment();
+                SelectionKey newKey = ch.register(newSelector, 
key.interestOps(), session);
+                session.setSelectionKey( newKey );
             }
 
+            // Now we can close the old selector and switch it
             selector.close();
             selector = newSelector;
         }


Reply via email to