You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/05/09 12:38:55 UTC

svn commit: r169269 - in /directory/network/branches/api_integration/src/java/org/apache/mina: common/ filter/ filter/codec/ transport/socket/nio/ util/

Author: trustin
Date: Mon May  9 03:38:52 2005
New Revision: 169269

URL: http://svn.apache.org/viewcvs?rev=169269&view=rev
Log:
Fixed: ByteBuffers are not reused

Added:
    directory/network/branches/api_integration/src/java/org/apache/mina/util/ByteBufferUtil.java   (with props)
Modified:
    directory/network/branches/api_integration/src/java/org/apache/mina/common/AbstractIoFilterChain.java
    directory/network/branches/api_integration/src/java/org/apache/mina/common/ByteBuffer.java
    directory/network/branches/api_integration/src/java/org/apache/mina/filter/ThreadPoolFilter.java
    directory/network/branches/api_integration/src/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
    directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/DatagramAcceptor.java
    directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/DatagramConnector.java
    directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java

Modified: directory/network/branches/api_integration/src/java/org/apache/mina/common/AbstractIoFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/api_integration/src/java/org/apache/mina/common/AbstractIoFilterChain.java?rev=169269&r1=169268&r2=169269&view=diff
==============================================================================
--- directory/network/branches/api_integration/src/java/org/apache/mina/common/AbstractIoFilterChain.java (original)
+++ directory/network/branches/api_integration/src/java/org/apache/mina/common/AbstractIoFilterChain.java Mon May  9 03:38:52 2005
@@ -26,6 +26,7 @@
 import java.util.Map;
 
 import org.apache.mina.common.IoFilter.NextFilter;
+import org.apache.mina.util.ByteBufferUtil;
 
 /**
  * An abstract implementation of {@link IoFilterChain} that provides
@@ -151,14 +152,27 @@
             public void messageReceived( NextFilter nextFilter, IoSession session,
                                          Object message ) throws Exception
             {
-                IoHandler handler = session.getHandler();
-                handler.messageReceived( session, message );
+                try
+                {
+                    session.getHandler().messageReceived( session, message );
+                }
+                finally
+                {
+                    ByteBufferUtil.releaseIfPossible( message );
+                }
             }
 
             public void messageSent( NextFilter nextFilter, IoSession session,
                                      Object message ) throws Exception
             {
-                session.getHandler().messageSent( session, message );
+                try
+                {
+                    session.getHandler().messageSent( session, message );
+                }
+                finally
+                {
+                    ByteBufferUtil.releaseIfPossible( message );
+                }
             }
 
             public void filterWrite( NextFilter nextFilter,

Modified: directory/network/branches/api_integration/src/java/org/apache/mina/common/ByteBuffer.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/api_integration/src/java/org/apache/mina/common/ByteBuffer.java?rev=169269&r1=169268&r2=169269&view=diff
==============================================================================
--- directory/network/branches/api_integration/src/java/org/apache/mina/common/ByteBuffer.java (original)
+++ directory/network/branches/api_integration/src/java/org/apache/mina/common/ByteBuffer.java Mon May  9 03:38:52 2005
@@ -529,6 +529,7 @@
 
         private synchronized void init( java.nio.ByteBuffer buf )
         {
+            System.out.println("INIT: " + System.identityHashCode( this ) );
             this.buf = buf;
             buf.clear();
             buf.order( ByteOrder.BIG_ENDIAN );
@@ -538,6 +539,7 @@
         
         public synchronized void acquire()
         {
+            System.out.println("ACQUIRE: " + System.identityHashCode( this ) + ' ' + this );
             if( refCount <= 0 )
             {
                 throw new IllegalStateException( "Already released buffer." );
@@ -548,6 +550,7 @@
 
         public void release()
         {
+            System.out.println("RELEASE: " + System.identityHashCode( this ) );
             synchronized( this )
             {
                 if( refCount <= 0 )

Modified: directory/network/branches/api_integration/src/java/org/apache/mina/filter/ThreadPoolFilter.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/api_integration/src/java/org/apache/mina/filter/ThreadPoolFilter.java?rev=169269&r1=169268&r2=169269&view=diff
==============================================================================
--- directory/network/branches/api_integration/src/java/org/apache/mina/filter/ThreadPoolFilter.java (original)
+++ directory/network/branches/api_integration/src/java/org/apache/mina/filter/ThreadPoolFilter.java Mon May  9 03:38:52 2005
@@ -23,6 +23,7 @@
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.util.BaseThreadPool;
+import org.apache.mina.util.ByteBufferUtil;
 import org.apache.mina.util.EventType;
 import org.apache.mina.util.ThreadPool;
 
@@ -72,14 +73,16 @@
     }
 
     public void messageReceived( NextFilter nextFilter,
-                                IoSession session, Object message )
+                                 IoSession session, Object message )
     {
+        ByteBufferUtil.acquireIfPossible( message );
         fireEvent( nextFilter, session, EventType.RECEIVED, message );
     }
 
     public void messageSent( NextFilter nextFilter,
-                            IoSession session, Object message )
+                             IoSession session, Object message )
     {
+        ByteBufferUtil.acquireIfPossible( message );
         fireEvent( nextFilter, session, EventType.SENT, message );
     }
 
@@ -93,10 +96,12 @@
         if( type == EventType.RECEIVED )
         {
             nextFilter.messageReceived( session, data );
+            ByteBufferUtil.releaseIfPossible( data );
         }
         else if( type == EventType.SENT )
         {
             nextFilter.messageSent( session, data );
+            ByteBufferUtil.releaseIfPossible( data );
         }
         else if( type == EventType.EXCEPTION )
         {

Modified: directory/network/branches/api_integration/src/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/api_integration/src/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java?rev=169269&r1=169268&r2=169269&view=diff
==============================================================================
--- directory/network/branches/api_integration/src/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java (original)
+++ directory/network/branches/api_integration/src/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java Mon May  9 03:38:52 2005
@@ -36,7 +36,16 @@
             {
                 decoder.decode( session, in, decoderOut );
             }
-
+            
+            in.release();
+        }
+        catch( ProtocolViolationException pve )
+        {
+            pve.setBuffer( in );
+            throw pve;
+        }
+        finally
+        {
             Queue queue = decoderOut.getMessageQueue();
             synchronized( queue )
             {
@@ -50,17 +59,19 @@
                 }
             }
         }
-        catch( ProtocolViolationException pve )
-        {
-            pve.setBuffer( in );
-            throw pve;
-        }
     }
 
     public void messageSent( NextFilter nextFilter, IoSession session, Object message ) throws Exception
     {
         MessageByteBuffer buf = ( MessageByteBuffer ) message;
-        nextFilter.messageSent( session, buf.message );
+        try
+        {
+            buf.release();
+        }
+        finally
+        {
+            nextFilter.messageSent( session, buf.message );
+        }
     }
     
     public void filterWrite( NextFilter nextFilter, IoSession session, Object message ) throws Exception

Modified: directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/DatagramAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/DatagramAcceptor.java?rev=169269&r1=169268&r2=169269&view=diff
==============================================================================
--- directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/DatagramAcceptor.java (original)
+++ directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/DatagramAcceptor.java Mon May  9 03:38:52 2005
@@ -359,7 +359,6 @@
                     writeBufferQueue.pop();
                 }
 
-                // FIXME buffer must be released after messageSent is fired.
                 session.getManagerFilterChain().messageSent( session, buf );
                 continue;
             }

Modified: directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/DatagramConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/DatagramConnector.java?rev=169269&r1=169268&r2=169269&view=diff
==============================================================================
--- directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/DatagramConnector.java (original)
+++ directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/DatagramConnector.java Mon May  9 03:38:52 2005
@@ -356,7 +356,6 @@
                     writeBufferQueue.pop();
                 }
 
-                // FIXME buffer must be released after messageSent is fired.
                 session.getManagerFilterChain().messageSent( session, buf );
                 continue;
             }

Modified: directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java?rev=169269&r1=169268&r2=169269&view=diff
==============================================================================
--- directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java (original)
+++ directory/network/branches/api_integration/src/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java Mon May  9 03:38:52 2005
@@ -451,7 +451,6 @@
                     writeBufferQueue.pop();
                 }
                 
-                // FIXME buffer is not released
                 session.getManagerFilterChain().messageSent( session, buf );
                 continue;
             }

Added: directory/network/branches/api_integration/src/java/org/apache/mina/util/ByteBufferUtil.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/api_integration/src/java/org/apache/mina/util/ByteBufferUtil.java?rev=169269&view=auto
==============================================================================
--- directory/network/branches/api_integration/src/java/org/apache/mina/util/ByteBufferUtil.java (added)
+++ directory/network/branches/api_integration/src/java/org/apache/mina/util/ByteBufferUtil.java Mon May  9 03:38:52 2005
@@ -0,0 +1,50 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+package org.apache.mina.util;
+
+import org.apache.mina.common.ByteBuffer;
+
+/**
+ * ByteBuffer utility.
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class ByteBufferUtil
+{
+    public static void acquireIfPossible( Object message )
+    {
+        if( message instanceof ByteBuffer )
+        {
+            ( ( ByteBuffer ) message ).acquire();
+        }
+    }
+    
+    public static void releaseIfPossible( Object message )
+    {
+        if( message instanceof ByteBuffer )
+        {
+            ( ( ByteBuffer ) message ).release();
+        }
+    }
+    
+    private ByteBufferUtil()
+    {
+    }
+}

Propchange: directory/network/branches/api_integration/src/java/org/apache/mina/util/ByteBufferUtil.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision