Author: trustin
Date: Tue Mar 27 19:20:04 2007
New Revision: 523143

URL: http://svn.apache.org/viewvc?view=rev&rev=523143
Log:
Fixed issue: DIRMINA-363 (Visibility problem in ProtocolCodecFilter)
* Added DECODER_LOCK attribute to store a per-session decoder lock
* Acquired appropriate lock to remove the visibility problem
* Added more JavaDoc comments to SynchronizedProtocol(Encoder|Decoder)


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/SynchronizedProtocolDecoder.java
    
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.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/SynchronizedProtocolDecoder.java
    
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.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/SynchronizedProtocolDecoder.java
    
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.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=523143&r1=523142&r2=523143
==============================================================================
--- 
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
 Tue Mar 27 19:20:04 2007
@@ -44,6 +44,8 @@
     public static final String ENCODER = ProtocolCodecFilter.class.getName() + 
".encoder";
     public static final String DECODER = ProtocolCodecFilter.class.getName() + 
".decoder";
     
+    private static final String DECODER_LOCK = 
ProtocolCodecFilter.class.getName() + ".decoderLock";
+    
     private static final Class[] EMPTY_PARAMS = new Class[0];
     private static final ByteBuffer EMPTY_BUFFER = ByteBuffer.wrap( new 
byte[0] );
 
@@ -156,11 +158,15 @@
 
         ByteBuffer in = ( ByteBuffer ) message;
         ProtocolDecoder decoder = getDecoder( session );
+        Object decoderLock = getDecoderLock( session );
         ProtocolDecoderOutput decoderOut = getDecoderOut( session, nextFilter 
);
         
         try
         {
-            decoder.decode( session, in, decoderOut );
+            synchronized( decoderLock )
+            {
+                decoder.decode( session, in, decoderOut );
+            }
         }
         catch( Throwable t )
         {
@@ -295,6 +301,18 @@
             session.setAttribute( ENCODER, encoder );
         }
         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 )

Modified: 
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java?view=diff&rev=523143&r1=523142&r2=523143
==============================================================================
--- 
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java
 (original)
+++ 
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java
 Tue Mar 27 19:20:04 2007
@@ -26,7 +26,10 @@
  * A [EMAIL PROTECTED] ProtocolDecoder} implementation which decorates an 
existing decoder
  * to be thread-safe.  Please be careful if you're going to use this decorator
  * because it can be a root of performance degradation in a multi-thread
- * environment.
+ * environment.  Also, by default, appropriate synchronization is done
+ * on a per-session basis by [EMAIL PROTECTED] ProtocolCodecFilter}.  Please 
use this
+ * decorator only when you need to synchronize on a per-decoder basis, which
+ * is not common.
  * 
  * @author The Apache Directory Project ([email protected])
  * @version $Rev$, $Date$

Modified: 
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.java?view=diff&rev=523143&r1=523142&r2=523143
==============================================================================
--- 
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.java
 (original)
+++ 
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.java
 Tue Mar 27 19:20:04 2007
@@ -25,7 +25,9 @@
  * A [EMAIL PROTECTED] ProtocolEncoder} implementation which decorates an 
existing encoder
  * to be thread-safe.  Please be careful if you're going to use this decorator
  * because it can be a root of performance degradation in a multi-thread
- * environment.
+ * environment.  Please use this decorator only when you need to synchronize
+ * on a per-encoder basis instead of on a per-session basis, which is not
+ * common.
  * 
  * @author The Apache Directory Project ([email protected])
  * @version $Rev$, $Date$

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=523143&r1=523142&r2=523143
==============================================================================
--- 
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
 Tue Mar 27 19:20:04 2007
@@ -43,7 +43,9 @@
 {
     public static final String ENCODER = ProtocolCodecFilter.class.getName() + 
".encoder";
     public static final String DECODER = ProtocolCodecFilter.class.getName() + 
".decoder";
-
+    
+    private static final String DECODER_LOCK = 
ProtocolCodecFilter.class.getName() + ".decoderLock";
+    
     private static final Class[] EMPTY_PARAMS = new Class[0];
     private static final ByteBuffer EMPTY_BUFFER = ByteBuffer.wrap( new 
byte[0] );
 
@@ -83,7 +85,9 @@
         };
     }
 
-    public ProtocolCodecFilter( final Class encoderClass, final Class 
decoderClass )
+    public ProtocolCodecFilter(
+            final Class<? extends ProtocolEncoder> encoderClass,
+            final Class<? extends ProtocolDecoder> decoderClass )
     {
         if( encoderClass == null )
         {
@@ -122,12 +126,12 @@
         {
             public ProtocolEncoder getEncoder() throws Exception
             {
-                return ( ProtocolEncoder ) encoderClass.newInstance();
+                return encoderClass.newInstance();
             }
 
             public ProtocolDecoder getDecoder() throws Exception
             {
-                return ( ProtocolDecoder ) decoderClass.newInstance();
+                return decoderClass.newInstance();
             }
         };
     }
@@ -158,11 +162,15 @@
 
         ByteBuffer in = ( ByteBuffer ) message;
         ProtocolDecoder decoder = getDecoder( session );
+        Object decoderLock = getDecoderLock( session );
         ProtocolDecoderOutput decoderOut = getDecoderOut( session, nextFilter 
);
 
         try
         {
-            decoder.decode( session, in, decoderOut );
+            synchronized( decoderLock )
+            {
+                decoder.decode( session, in, decoderOut );
+            }
         }
         catch( Throwable t )
         {
@@ -318,6 +326,18 @@
         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 );

Modified: 
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java?view=diff&rev=523143&r1=523142&r2=523143
==============================================================================
--- 
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java
 (original)
+++ 
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java
 Tue Mar 27 19:20:04 2007
@@ -26,7 +26,10 @@
  * A [EMAIL PROTECTED] ProtocolDecoder} implementation which decorates an 
existing decoder
  * to be thread-safe.  Please be careful if you're going to use this decorator
  * because it can be a root of performance degradation in a multi-thread
- * environment.
+ * environment.  Also, by default, appropriate synchronization is done
+ * on a per-session basis by [EMAIL PROTECTED] ProtocolCodecFilter}.  Please 
use this
+ * decorator only when you need to synchronize on a per-decoder basis, which
+ * is not common.
  * 
  * @author The Apache Directory Project ([email protected])
  * @version $Rev$, $Date$

Modified: 
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.java?view=diff&rev=523143&r1=523142&r2=523143
==============================================================================
--- 
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.java
 (original)
+++ 
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.java
 Tue Mar 27 19:20:04 2007
@@ -25,7 +25,9 @@
  * A [EMAIL PROTECTED] ProtocolEncoder} implementation which decorates an 
existing encoder
  * to be thread-safe.  Please be careful if you're going to use this decorator
  * because it can be a root of performance degradation in a multi-thread
- * environment.
+ * environment.  Please use this decorator only when you need to synchronize
+ * on a per-encoder basis instead of on a per-session basis, which is not
+ * common.
  * 
  * @author The Apache Directory Project ([email protected])
  * @version $Rev$, $Date$

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=523143&r1=523142&r2=523143
==============================================================================
--- 
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
 Tue Mar 27 19:20:04 2007
@@ -44,6 +44,8 @@
     public static final String ENCODER = ProtocolCodecFilter.class.getName() + 
".encoder";
     public static final String DECODER = ProtocolCodecFilter.class.getName() + 
".decoder";
     
+    private static final String DECODER_LOCK = 
ProtocolCodecFilter.class.getName() + ".decoderLock";
+    
     private static final Class[] EMPTY_PARAMS = new Class[0];
     private static final ByteBuffer EMPTY_BUFFER = ByteBuffer.wrap( new 
byte[0] );
 
@@ -158,11 +160,15 @@
 
         ByteBuffer in = ( ByteBuffer ) message;
         ProtocolDecoder decoder = getDecoder( session );
+        Object decoderLock = getDecoderLock( session );
         ProtocolDecoderOutput decoderOut = getDecoderOut( session, nextFilter 
);
         
         try
         {
-            decoder.decode( session, in, decoderOut );
+            synchronized( decoderLock )
+            {
+                decoder.decode( session, in, decoderOut );
+            }
         }
         catch( Throwable t )
         {
@@ -310,6 +316,18 @@
             session.setAttribute( DECODER, decoder );
         }
         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 )

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java?view=diff&rev=523143&r1=523142&r2=523143
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolDecoder.java
 Tue Mar 27 19:20:04 2007
@@ -26,7 +26,10 @@
  * A [EMAIL PROTECTED] ProtocolDecoder} implementation which decorates an 
existing decoder
  * to be thread-safe.  Please be careful if you're going to use this decorator
  * because it can be a root of performance degradation in a multi-thread
- * environment.
+ * environment.  Also, by default, appropriate synchronization is done
+ * on a per-session basis by [EMAIL PROTECTED] ProtocolCodecFilter}.  Please 
use this
+ * decorator only when you need to synchronize on a per-decoder basis, which
+ * is not common.
  * 
  * @author The Apache MINA Project ([email protected])
  * @version $Rev$, $Date$

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.java?view=diff&rev=523143&r1=523142&r2=523143
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/SynchronizedProtocolEncoder.java
 Tue Mar 27 19:20:04 2007
@@ -25,7 +25,9 @@
  * A [EMAIL PROTECTED] ProtocolEncoder} implementation which decorates an 
existing encoder
  * to be thread-safe.  Please be careful if you're going to use this decorator
  * because it can be a root of performance degradation in a multi-thread
- * environment.
+ * environment.  Please use this decorator only when you need to synchronize
+ * on a per-encoder basis instead of on a per-session basis, which is not
+ * common.
  * 
  * @author The Apache MINA Project ([email protected])
  * @version $Rev$, $Date$


Reply via email to