Author: elecharny Date: Mon Mar 9 16:53:13 2009 New Revision: 751744 URL: http://svn.apache.org/viewvc?rev=751744&view=rev Log: o Added a constant (SELECT_TIMEOU° to replace the magic numbers used in the Processor o The select(int) is now a select(long), as the Selector.select() method uses a long, not an int. o Minor refactoring
Modified: mina/trunk/core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java mina/trunk/core/src/main/java/org/apache/mina/filter/codec/demux/DemuxingProtocolDecoder.java mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioProcessor.java mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprIoProcessor.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=751744&r1=751743&r2=751744&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 Mon Mar 9 16:53:13 2009 @@ -62,6 +62,9 @@ * It improves memory utilization and write throughput significantly. */ private static final int WRITE_SPIN_COUNT = 256; + + /** A timeout used for the select, as we need to get out to deal with idle sessions */ + private static final long SELECT_TIMEOUT = 1000L; /** A map containing the last Thread ID for each class */ private static final Map<Class<?>, AtomicInteger> threadIds = @@ -183,7 +186,7 @@ * @return The number of session ready for read or for write * @throws Exception if some low level IO error occurs */ - protected abstract int select(int timeout) throws Exception; + protected abstract int select(long timeout) throws Exception; /** * poll those sessions forever @@ -623,7 +626,7 @@ private void notifyIdleSessions(long currentTime) throws Exception { // process idle sessions - if (currentTime - lastIdleCheckTime >= 1000) { + if (currentTime - lastIdleCheckTime >= SELECT_TIMEOUT) { lastIdleCheckTime = currentTime; AbstractIoSession.notifyIdleness(allSessions(), currentTime); } @@ -874,8 +877,11 @@ for (;;) { try { - // TODO: Why do we use a timeout here ??? - int selected = select(1000); + // This select has a timeout so that we can manage + // dile session when we get out of the select every + // second. (note : this is a hack to avoid creating + // a dedicated thread). + int selected = select(SELECT_TIMEOUT); nSessions += handleNewSessions(); updateTrafficMask(); Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/demux/DemuxingProtocolDecoder.java URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/demux/DemuxingProtocolDecoder.java?rev=751744&r1=751743&r2=751744&view=diff ============================================================================== --- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/demux/DemuxingProtocolDecoder.java (original) +++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/demux/DemuxingProtocolDecoder.java Mon Mar 9 16:53:13 2009 @@ -125,15 +125,18 @@ protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { State state = getState(session); + if (state.currentDecoder == null) { MessageDecoder[] decoders = state.decoders; int undecodables = 0; + for (int i = decoders.length - 1; i >= 0; i--) { MessageDecoder decoder = decoders[i]; int limit = in.limit(); int pos = in.position(); MessageDecoderResult result; + try { result = decoder.decodable(session, in); } finally { @@ -209,13 +212,16 @@ private State getState(IoSession session) throws Exception { State state = (State) session.getAttribute(STATE); + if (state == null) { state = new State(); State oldState = (State) session.setAttributeIfAbsent(STATE, state); + if (oldState != null) { state = oldState; } } + return state; } 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=751744&r1=751743&r2=751744&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 Mon Mar 9 16:53:13 2009 @@ -65,7 +65,7 @@ } @Override - protected int select(int timeout) throws Exception { + protected int select(long timeout) throws Exception { return selector.select(timeout); } Modified: mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprIoProcessor.java URL: http://svn.apache.org/viewvc/mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprIoProcessor.java?rev=751744&r1=751743&r2=751744&view=diff ============================================================================== --- mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprIoProcessor.java (original) +++ mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprIoProcessor.java Mon Mar 9 16:53:13 2009 @@ -130,7 +130,7 @@ } @Override - protected int select(int timeout) throws Exception { + protected int select(long timeout) throws Exception { int rv = Poll.poll(pollset, 1000 * timeout, polledSockets, false); if (rv <= 0) { if (rv != -120001) {