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;