You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2007/07/26 09:03:24 UTC
svn commit: r559722 - in /mina:
branches/1.0/core/src/main/java/org/apache/mina/filter/codec/
branches/1.0/core/src/main/java/org/apache/mina/filter/codec/support/
branches/1.1/core/src/main/java/org/apache/mina/filter/codec/
branches/1.1/core/src/main...
Author: trustin
Date: Thu Jul 26 00:03:21 2007
New Revision: 559722
URL: http://svn.apache.org/viewvc?view=rev&rev=559722
Log:
Fixed DIRMINA-405 (IoSession.suspendRead() doesn't suspend read operation immediately when ProtocolCodecFilter is used.)
* Changed SimpleProtocolDecoderOut not to flush messages if trafficMask is set to unreadable
* Replaced decoderLock with decoderOut
Modified:
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java
Modified: mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
URL: http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java?view=diff&rev=559722&r1=559721&r2=559722
==============================================================================
--- mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java (original)
+++ mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java Thu Jul 26 00:03:21 2007
@@ -45,10 +45,9 @@
public static final String DECODER = ProtocolCodecFilter.class.getName()
+ ".decoder";
-
- private static final String DECODER_LOCK = ProtocolCodecFilter.class
- .getName()
- + ".decoderLock";
+
+ private static final String DECODER_OUT = ProtocolCodecFilter.class.getName()
+ + ".decoderOut";
private static final Class[] EMPTY_PARAMS = new Class[0];
@@ -135,6 +134,7 @@
NextFilter nextFilter) throws Exception {
disposeEncoder(parent.getSession());
disposeDecoder(parent.getSession());
+ disposeDecoderOut(parent.getSession());
}
public void messageReceived(NextFilter nextFilter, IoSession session,
@@ -146,11 +146,10 @@
ByteBuffer in = (ByteBuffer) message;
ProtocolDecoder decoder = getDecoder(session);
- Object decoderLock = getDecoderLock(session);
ProtocolDecoderOutput decoderOut = getDecoderOut(session, nextFilter);
try {
- synchronized (decoderLock) {
+ synchronized (decoderOut) {
decoder.decode(session, in, decoderOut);
}
} catch (Throwable t) {
@@ -242,7 +241,7 @@
// Dispose all.
disposeEncoder(session);
disposeDecoder(session);
-
+ disposeDecoderOut(session);
decoderOut.flush();
}
@@ -259,16 +258,6 @@
return encoder;
}
- private Object getDecoderLock(IoSession session) {
- Object lock = session.getAttribute(DECODER_LOCK);
- if (lock == null) {
- lock = new Object();
- session.setAttribute(DECODER_LOCK, lock);
- }
-
- return lock;
- }
-
private ProtocolEncoderOutputImpl getEncoderOut(IoSession session,
NextFilter nextFilter, WriteRequest writeRequest) {
return new ProtocolEncoderOutputImpl(session, nextFilter, writeRequest);
@@ -286,7 +275,13 @@
private ProtocolDecoderOutput getDecoderOut(IoSession session,
NextFilter nextFilter) {
- return new SimpleProtocolDecoderOutput(session, nextFilter);
+ ProtocolDecoderOutput out = (ProtocolDecoderOutput) session.getAttribute(DECODER_OUT);
+ if (out == null) {
+ out = new SimpleProtocolDecoderOutput(session, nextFilter);
+ session.setAttribute(DECODER_OUT, out);
+ }
+
+ return out;
}
private void disposeEncoder(IoSession session) {
@@ -318,7 +313,11 @@
+ decoder.getClass().getName() + " (" + decoder + ')');
}
}
-
+
+ private void disposeDecoderOut(IoSession session) {
+ session.removeAttribute(DECODER_OUT);
+ }
+
private static class HiddenByteBuffer extends ByteBufferProxy {
private HiddenByteBuffer(ByteBuffer buf) {
super(buf);
Modified: mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java
URL: http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java?view=diff&rev=559722&r1=559721&r2=559722
==============================================================================
--- mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java (original)
+++ mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java Thu Jul 26 00:03:21 2007
@@ -43,7 +43,7 @@
this.nextFilter = nextFilter;
this.session = session;
}
-
+
public void write(Object message) {
messageQueue.push(message);
if (session instanceof BaseIoSession) {
@@ -53,8 +53,11 @@
public void flush() {
while (!messageQueue.isEmpty()) {
- nextFilter.messageReceived(session, messageQueue.pop());
+ if (session.getTrafficMask().isReadable()) {
+ nextFilter.messageReceived(session, messageQueue.pop());
+ } else {
+ break;
+ }
}
-
}
}
Modified: mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
URL: http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java?view=diff&rev=559722&r1=559721&r2=559722
==============================================================================
--- mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java (original)
+++ mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java Thu Jul 26 00:03:21 2007
@@ -46,9 +46,8 @@
public static final String DECODER = ProtocolCodecFilter.class.getName()
+ ".decoder";
- private static final String DECODER_LOCK = ProtocolCodecFilter.class
- .getName()
- + ".decoderLock";
+ private static final String DECODER_OUT = ProtocolCodecFilter.class.getName()
+ + ".decoderOut";
private static final Class<?>[] EMPTY_PARAMS = new Class[0];
@@ -137,6 +136,7 @@
NextFilter nextFilter) throws Exception {
disposeEncoder(parent.getSession());
disposeDecoder(parent.getSession());
+ disposeDecoderOut(parent.getSession());
}
@Override
@@ -149,11 +149,10 @@
ByteBuffer in = (ByteBuffer) message;
ProtocolDecoder decoder = getDecoder(session);
- Object decoderLock = getDecoderLock(session);
ProtocolDecoderOutput decoderOut = getDecoderOut(session, nextFilter);
try {
- synchronized (decoderLock) {
+ synchronized (decoderOut) {
decoder.decode(session, in, decoderOut);
}
} catch (Throwable t) {
@@ -248,7 +247,7 @@
// Dispose all.
disposeEncoder(session);
disposeDecoder(session);
-
+ disposeDecoderOut(session);
decoderOut.flush();
}
@@ -280,19 +279,14 @@
return decoder;
}
- private Object getDecoderLock(IoSession session) {
- Object lock = session.getAttribute(DECODER_LOCK);
- if (lock == null) {
- lock = new Object();
- session.setAttribute(DECODER_LOCK, lock);
- }
-
- return lock;
- }
-
private ProtocolDecoderOutput getDecoderOut(IoSession session,
NextFilter nextFilter) {
- return new SimpleProtocolDecoderOutput(session, nextFilter);
+ ProtocolDecoderOutput out = (ProtocolDecoderOutput) session.getAttribute(DECODER_OUT);
+ if (out == null) {
+ out = new SimpleProtocolDecoderOutput(session, nextFilter);
+ session.setAttribute(DECODER_OUT, out);
+ }
+ return out;
}
private void disposeEncoder(IoSession session) {
@@ -324,7 +318,11 @@
+ decoder.getClass().getName() + " (" + decoder + ')');
}
}
-
+
+ private void disposeDecoderOut(IoSession session) {
+ session.removeAttribute(DECODER_OUT);
+ }
+
private static class HiddenByteBuffer extends ByteBufferProxy {
private HiddenByteBuffer(ByteBuffer buf) {
super(buf);
Modified: mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java
URL: http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java?view=diff&rev=559722&r1=559721&r2=559722
==============================================================================
--- mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java (original)
+++ mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java Thu Jul 26 00:03:21 2007
@@ -45,7 +45,7 @@
this.nextFilter = nextFilter;
this.session = session;
}
-
+
public void write(Object message) {
messageQueue.add(message);
if (session instanceof BaseIoSession) {
@@ -55,7 +55,11 @@
public void flush() {
while (!messageQueue.isEmpty()) {
- nextFilter.messageReceived(session, messageQueue.remove(0));
+ if (session.getTrafficMask().isReadable()) {
+ nextFilter.messageReceived(session, messageQueue.remove(0));
+ } else {
+ break;
+ }
}
}
Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java?view=diff&rev=559722&r1=559721&r2=559722
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java Thu Jul 26 00:03:21 2007
@@ -50,9 +50,8 @@
public static final String DECODER = ProtocolCodecFilter.class.getName()
+ ".decoder";
- private static final String DECODER_LOCK = ProtocolCodecFilter.class
- .getName()
- + ".decoderLock";
+ private static final String DECODER_OUT = ProtocolCodecFilter.class.getName()
+ + ".decoderOut";
private static final Class<?>[] EMPTY_PARAMS = new Class[0];
@@ -142,6 +141,7 @@
NextFilter nextFilter) throws Exception {
disposeEncoder(parent.getSession());
disposeDecoder(parent.getSession());
+ disposeDecoderOut(parent.getSession());
}
@Override
@@ -154,11 +154,10 @@
ByteBuffer in = (ByteBuffer) message;
ProtocolDecoder decoder = getDecoder(session);
- Object decoderLock = getDecoderLock(session);
ProtocolDecoderOutput decoderOut = getDecoderOut(session, nextFilter);
try {
- synchronized (decoderLock) {
+ synchronized (decoderOut) {
decoder.decode(session, in, decoderOut);
}
} catch (Throwable t) {
@@ -250,7 +249,7 @@
// Dispose all.
disposeEncoder(session);
disposeDecoder(session);
-
+ disposeDecoderOut(session);
decoderOut.flush();
}
@@ -282,19 +281,14 @@
return decoder;
}
- private Object getDecoderLock(IoSession session) {
- Object lock = session.getAttribute(DECODER_LOCK);
- if (lock == null) {
- session.setAttributeIfAbsent(DECODER_LOCK, new Object());
- lock = session.getAttribute(DECODER_LOCK);
- }
-
- return lock;
- }
-
private ProtocolDecoderOutput getDecoderOut(IoSession session,
NextFilter nextFilter) {
- return new SimpleProtocolDecoderOutput(session, nextFilter);
+ ProtocolDecoderOutput out = (ProtocolDecoderOutput) session.getAttribute(DECODER_OUT);
+ if (out == null) {
+ out = new SimpleProtocolDecoderOutput(session, nextFilter);
+ session.setAttribute(DECODER_OUT, out);
+ }
+ return out;
}
private void disposeEncoder(IoSession session) {
@@ -327,6 +321,10 @@
}
}
+ private void disposeDecoderOut(IoSession session) {
+ session.removeAttribute(DECODER_OUT);
+ }
+
private static class EncodedWriteRequest extends DefaultWriteRequest {
private EncodedWriteRequest(ByteBuffer encodedMessage,
WriteFuture future, SocketAddress destination) {
Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java?view=diff&rev=559722&r1=559721&r2=559722
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/support/SimpleProtocolDecoderOutput.java Thu Jul 26 00:03:21 2007
@@ -45,7 +45,7 @@
this.nextFilter = nextFilter;
this.session = session;
}
-
+
public void write(Object message) {
if (message == null) {
throw new NullPointerException("message");
@@ -59,7 +59,11 @@
public void flush() {
while (!messageQueue.isEmpty()) {
- nextFilter.messageReceived(session, messageQueue.poll());
+ if (session.getTrafficMask().isReadable()) {
+ nextFilter.messageReceived(session, messageQueue.poll());
+ } else {
+ break;
+ }
}
}