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;
+            }
         }
 
     }