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 2012/11/21 12:14:54 UTC

svn commit: r1412059 - in /mina/mina/trunk/core/src: main/java/org/apache/mina/session/ main/java/org/apache/mina/transport/nio/ test/java/org/apache/mina/service/idlecheker/

Author: elecharny
Date: Wed Nov 21 11:14:53 2012
New Revision: 1412059

URL: http://svn.apache.org/viewvc?rev=1412059&view=rev
Log:
o The Selector is now visible in NioSession : we need it to be able to wake it up when the OP_WRITE flag is set on a SelectionKey
o Small improvements when computing the workers name, when we have only one Selector present
o Removed some 'final'
o Passed the NioSession in the Registration constructor
o The SelectionKey is now stored into the NioSession instance : we ned it to be able to register the OP_WRITE event on the SelectionKey when sending a message 
o Added a NioTcpServer constructor to pass only one SelectorLoopPool, when we want to use only one Selector to process all the events
o Added some methods in the NioRcpSession class
o Removed the "public abstract" qualifier in some interface 
o Replaced imports * by explicit imports
o Some Javadoc additions

Modified:
    mina/mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
    mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/FixedSelectorLoopPool.java
    mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioSelectorLoop.java
    mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioSession.java
    mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpServer.java
    mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java
    mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/SelectorLoop.java
    mina/mina/trunk/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java

Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java?rev=1412059&r1=1412058&r2=1412059&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java Wed Nov 21 11:14:53 2012
@@ -549,6 +549,9 @@ public abstract class AbstractIoSession 
             }
         }
 
+        // Always wake-up the selector here!
+        // TODO : wake up the selector.
+
         return request;
     }
 

Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/FixedSelectorLoopPool.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/FixedSelectorLoopPool.java?rev=1412059&r1=1412058&r2=1412059&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/FixedSelectorLoopPool.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/FixedSelectorLoopPool.java Wed Nov 21 11:14:53 2012
@@ -26,11 +26,10 @@ import java.util.concurrent.atomic.Atomi
  * @author <a href="http://mina.apache.org">Apache MINA Project</a>
  */
 public class FixedSelectorLoopPool implements SelectorLoopPool {
-
-    // the pool of selector loop
+    /** the pool of selector loop */
     private final SelectorLoop[] pool;
 
-    // the index of the next selector loop to be served
+    /** the index of the next selector loop to be served */
     private final AtomicInteger nextIndex = new AtomicInteger();
 
     /**
@@ -39,8 +38,12 @@ public class FixedSelectorLoopPool imple
      * @param size
      */
     public FixedSelectorLoopPool(final int size) {
+        if (size <= 0) {
+            throw new IllegalArgumentException("We can't create a pool with no Selectorloop in it");
+        }
 
         pool = new SelectorLoop[size];
+
         for (int i = 0; i < size; i++) {
             pool[i] = new NioSelectorLoop("I/O", i);
         }

Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioSelectorLoop.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioSelectorLoop.java?rev=1412059&r1=1412058&r2=1412059&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioSelectorLoop.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioSelectorLoop.java Wed Nov 21 11:14:53 2012
@@ -29,6 +29,7 @@ import java.util.Iterator;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
+import org.apache.mina.api.IoSession;
 import org.apache.mina.api.RuntimeIoException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -62,9 +63,27 @@ public class NioSelectorLoop implements 
      * @param prefix
      * @param index
      */
+    public NioSelectorLoop(final String prefix) {
+        this(prefix, -1);
+    }
+
+    /**
+     * Creates an instance of the SelectorLoop.
+     * 
+     * @param prefix
+     * @param index
+     */
     public NioSelectorLoop(final String prefix, final int index) {
-        logger = LoggerFactory.getLogger(NioSelectorLoop.class.getName() + ":" + prefix + "-" + index);
-        worker = new SelectorWorker(prefix, index);
+        String name = NioSelectorLoop.class.getName() + ":" + prefix;
+        String workerName = "SelectorWorker " + prefix;
+
+        if (index >= 0) {
+            name += "-" + index;
+            workerName += "-" + index;
+        }
+
+        logger = LoggerFactory.getLogger(name);
+        worker = new SelectorWorker(workerName);
 
         try {
             logger.debug("open a selector");
@@ -82,10 +101,19 @@ public class NioSelectorLoop implements 
      * {@inheritDoc}
      */
     @Override
-    public void register(final boolean accept, final boolean read, final boolean write,
-            final SelectorListener listener, final SelectableChannel channel) {
+    public void register(boolean accept, boolean read, boolean write, SelectorListener listener,
+            SelectableChannel channel) {
+        register(null, accept, read, write, listener, channel);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void register(IoSession session, boolean accept, boolean read, boolean write, SelectorListener listener,
+            SelectableChannel channel) {
         logger.debug("registering : {} for accept : {}, read : {}, write : {}", new Object[] { listener, accept, read,
-                                write });
+                write });
         int ops = 0;
 
         if (accept) {
@@ -101,7 +129,7 @@ public class NioSelectorLoop implements 
         }
 
         // TODO : if it's the same selector/worker, we don't need to do that we could directly enqueue
-        registrationQueue.add(new Registration(ops, channel, listener));
+        registrationQueue.add(new Registration(session, ops, channel, listener));
 
         // Now, wakeup the selector in order to let it update the selectionKey status
         selector.wakeup();
@@ -114,7 +142,7 @@ public class NioSelectorLoop implements 
     public void modifyRegistration(final boolean accept, final boolean read, final boolean write,
             final SelectorListener listener, final SelectableChannel channel) {
         logger.debug("modifying registration : {} for accept : {}, read : {}, write : {}", new Object[] { listener,
-                                accept, read, write });
+                accept, read, write });
 
         final SelectionKey key = channel.keyFor(selector);
         if (key == null) {
@@ -158,8 +186,8 @@ public class NioSelectorLoop implements 
      */
     private class SelectorWorker extends Thread {
 
-        public SelectorWorker(final String prefix, final int index) {
-            super("SelectorWorker " + prefix + "-" + index);
+        public SelectorWorker(String name) {
+            super(name);
             setDaemon(true);
         }
 
@@ -188,7 +216,13 @@ public class NioSelectorLoop implements 
                         final Registration reg = registrationQueue.poll();
 
                         try {
-                            reg.channel.register(selector, reg.ops, reg.listener);
+                            SelectionKey selectionKey = reg.channel.register(selector, reg.ops, reg.listener);
+
+                            IoSession session = reg.getSession();
+
+                            if (session != null) {
+                                ((NioSession) session).setSelectionKey(selectionKey);
+                            }
                         } catch (final ClosedChannelException ex) {
                             // dead session..
                             logger.error("socket is already dead", ex);
@@ -204,10 +238,11 @@ public class NioSelectorLoop implements 
 
     private class Registration {
 
-        public Registration(final int ops, final SelectableChannel channel, final SelectorListener listener) {
+        public Registration(IoSession session, int ops, SelectableChannel channel, SelectorListener listener) {
             this.ops = ops;
             this.channel = channel;
             this.listener = listener;
+            this.session = session;
         }
 
         private final int ops;
@@ -215,5 +250,16 @@ public class NioSelectorLoop implements 
         private final SelectableChannel channel;
 
         private final SelectorListener listener;
+
+        private final IoSession session;
+
+        public IoSession getSession() {
+            return session;
+        }
+    }
+
+    @Override
+    public void wakeup() {
+        selector.wakeup();
     }
 }
\ No newline at end of file

Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioSession.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioSession.java?rev=1412059&r1=1412058&r2=1412059&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioSession.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioSession.java Wed Nov 21 11:14:53 2012
@@ -20,6 +20,7 @@
 package org.apache.mina.transport.nio;
 
 import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
 
 import org.apache.mina.api.IoSession;
 
@@ -40,4 +41,17 @@ public interface NioSession extends IoSe
      * @param key The session's SelectionKey
      */
     void setSelectionKey(SelectionKey key);
+
+    /**
+     * Refers to the Selector in used by this session. A session is managed by one
+     * single selector during its own life.
+     * 
+     * @param selector The selector managing this session
+     */
+    void setSelector(Selector selector);
+
+    /**
+     * Wakeup the associated selector
+     */
+    void wakeup();
 }

Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpServer.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpServer.java?rev=1412059&r1=1412058&r2=1412059&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpServer.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpServer.java Wed Nov 21 11:14:53 2012
@@ -68,12 +68,26 @@ public class NioTcpServer extends Abstra
     }
 
     /**
+     * Create a TCP server with provided selector loops pool. We will use one SelectorLoop get from
+     * the pool to manage the OP_ACCEPT events. If the pool contains only one SelectorLoop, then
+     * all the events will be managed by the same Selector.
+     * 
+     * @param acceptSelectorLoop the selector loop for handling accept events (connection of new session)
+     * @param readWriteSelectorLoop the pool of selector loop for handling read/write events of connected sessions
+     */
+    public NioTcpServer(SelectorLoopPool selectorLoopPool) {
+        super();
+        this.acceptSelectorLoop = selectorLoopPool.getSelectorLoop();
+        this.readWriteSelectorPool = selectorLoopPool;
+    }
+
+    /**
      * Create a TCP server with provided selector loops pool
      * 
      * @param acceptSelectorLoop the selector loop for handling accept events (connection of new session)
      * @param readWriteSelectorLoop the pool of selector loop for handling read/write events of connected sessions
      */
-    public NioTcpServer(final SelectorLoop acceptSelectorLoop, final SelectorLoopPool readWriteSelectorLoop) {
+    public NioTcpServer(SelectorLoop acceptSelectorLoop, SelectorLoopPool readWriteSelectorLoop) {
         super();
         this.acceptSelectorLoop = acceptSelectorLoop;
         this.readWriteSelectorPool = readWriteSelectorLoop;
@@ -266,7 +280,7 @@ public class NioTcpServer extends Abstra
         }
 
         // add the session to the queue for being added to the selector
-        readWriteSelectorLoop.register(false, true, false, session, socketChannel);
+        readWriteSelectorLoop.register(session, false, true, false, session, socketChannel);
 
         session.processSessionOpened();
         session.setConnected();

Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java?rev=1412059&r1=1412058&r2=1412059&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java Wed Nov 21 11:14:53 2012
@@ -23,6 +23,8 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.nio.ByteBuffer;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
 import java.nio.channels.SocketChannel;
 import java.util.Queue;
 
@@ -45,7 +47,7 @@ import org.slf4j.LoggerFactory;
  * @author <a href="http://mina.apache.org">Apache MINA Project</a>
  * 
  */
-public class NioTcpSession extends AbstractIoSession implements SelectorListener {
+public class NioTcpSession extends AbstractIoSession implements NioSession, SelectorListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(NioTcpSession.class);
 
@@ -366,4 +368,38 @@ public class NioTcpSession extends Abstr
             throw new IllegalStateException("accept event should never occur on NioTcpSession");
         }
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public SelectionKey getSelectionKey() {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSelectionKey(SelectionKey key) {
+        // TODO Auto-generated method stub
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSelector(Selector selector) {
+        // TODO Auto-generated method stub
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void wakeup() {
+        selectorLoop.wakeup();
+    }
 }

Modified: mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/SelectorLoop.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/SelectorLoop.java?rev=1412059&r1=1412058&r2=1412059&view=diff
==============================================================================
--- mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/SelectorLoop.java (original)
+++ mina/mina/trunk/core/src/main/java/org/apache/mina/transport/nio/SelectorLoop.java Wed Nov 21 11:14:53 2012
@@ -20,6 +20,8 @@ package org.apache.mina.transport.nio;
 
 import java.nio.channels.SelectableChannel;
 
+import org.apache.mina.api.IoSession;
+
 /**
  * @author <a href="http://mina.apache.org">Apache MINA Project</a>
  */
@@ -28,18 +30,35 @@ public interface SelectorLoop {
      * Register a channel on a Selector, for some events. We can register for OP_ACCEPT,
      * OP_READ or OP_WRITE.
      * 
+     * @param session The session
      * @param accept Registers for OP_ACCEPT events
      * @param read Registers for OP_READ events
      * @param write Registers for OP_WRITE events
      * @param listener The listener
      * @param channel
      */
-    public abstract void register(boolean accept, boolean read, boolean write, SelectorListener listener,
+    void register(IoSession session, boolean accept, boolean read, boolean write, SelectorListener listener,
             SelectableChannel channel);
 
-    public abstract void modifyRegistration(boolean accept, boolean read, boolean write, SelectorListener listener,
+    /**
+     * Register a channel on a Selector, for some events. We can register for OP_ACCEPT,
+     * OP_READ or OP_WRITE.
+     * 
+     * @param accept Registers for OP_ACCEPT events
+     * @param read Registers for OP_READ events
+     * @param write Registers for OP_WRITE events
+     * @param listener The listener
+     * @param channel
+     */
+    void register(boolean accept, boolean read, boolean write, SelectorListener listener, SelectableChannel channel);
+
+    void modifyRegistration(boolean accept, boolean read, boolean write, SelectorListener listener,
             SelectableChannel channel);
 
-    public abstract void unregister(SelectorListener listener, SelectableChannel channel);
+    void unregister(SelectorListener listener, SelectableChannel channel);
 
+    /**
+     * Wake up the selector
+     */
+    void wakeup();
 }
\ No newline at end of file

Modified: mina/mina/trunk/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java
URL: http://svn.apache.org/viewvc/mina/mina/trunk/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java?rev=1412059&r1=1412058&r2=1412059&view=diff
==============================================================================
--- mina/mina/trunk/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java (original)
+++ mina/mina/trunk/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java Wed Nov 21 11:14:53 2012
@@ -21,8 +21,8 @@
  */
 package org.apache.mina.service.idlecheker;
 
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
 
 import java.net.SocketAddress;