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/03/14 04:11:41 UTC
svn commit: r157370 - in directory/network/mina/trunk/src:
java/org/apache/mina/common/ java/org/apache/mina/io/datagram/
java/org/apache/mina/io/filter/ java/org/apache/mina/io/socket/
java/org/apache/mina/protocol/codec/ java/org/apache/mina/protocol/io/
java/org/apache/mina/util/ test/org/apache/mina/common/
Author: trustin
Date: Sun Mar 13 19:11:37 2005
New Revision: 157370
URL: http://svn.apache.org/viewcvs?view=rev&rev=157370
Log:
* Changed static ByteBuffer.release() method to instance method.
* Added ByteBuffer.acquire() method to let users have control of releasing buffers.
* IoHandlerFilterManager and IoThreadPoolFilter utilizes new acquire() and release() now.
Modified:
directory/network/mina/trunk/src/java/org/apache/mina/common/ByteBuffer.java
directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java
directory/network/mina/trunk/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java
directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java
directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketSession.java
directory/network/mina/trunk/src/java/org/apache/mina/protocol/codec/NettyEncoder.java
directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java
directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFilterManager.java
directory/network/mina/trunk/src/test/org/apache/mina/common/ByteBufferTest.java
Modified: directory/network/mina/trunk/src/java/org/apache/mina/common/ByteBuffer.java
URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/org/apache/mina/common/ByteBuffer.java?view=diff&r1=157369&r2=157370
==============================================================================
--- directory/network/mina/trunk/src/java/org/apache/mina/common/ByteBuffer.java (original)
+++ directory/network/mina/trunk/src/java/org/apache/mina/common/ByteBuffer.java Sun Mar 13 19:11:37 2005
@@ -98,43 +98,14 @@
}
buf.clear();
- // Check leaked or dangling ByteBuffer.
- if( buf.inUse )
+ synchronized( buf )
{
- throw new IllegalStateException(
- "Already allocated buffer. Did you release the buffer more than once?" );
- }
- else
- {
- buf.inUse = true;
+ buf.refCount = 1;
}
return buf;
}
- /**
- * Returns the specified buffer to buffer pool.
- */
- public static void release( ByteBuffer buf )
- {
- Stack stack = bufferStacks[ getBufferStackIndex( buf.capacity() ) ];
- synchronized( stack )
- {
- // Check leaked or dangling ByteBuffer.
- if( !buf.inUse )
- {
- throw new IllegalStateException(
- "Already released buffer. Did you release the buffer more than once?" );
- }
- else
- {
- buf.inUse = false; // clear the flag
- }
-
- stack.push( buf );
- }
- }
-
private static int getBufferStackIndex( int size )
{
int targetSize = 16;
@@ -155,11 +126,58 @@
private final java.nio.ByteBuffer buf;
- private boolean inUse;
+ private int refCount = 1;
private ByteBuffer( java.nio.ByteBuffer buf )
{
this.buf = buf;
+ }
+
+ /**
+ * Increases the internal reference count of this buffer to defer
+ * automatic release. You have to invoke {@link #release()} as many
+ * as you invoked this method to release this buffer.
+ *
+ * @throws IllegalStateException if you attempt to acquire already
+ * released buffer.
+ */
+ public synchronized void acquire()
+ {
+ if( refCount <= 0 )
+ {
+ throw new IllegalStateException( "Already released buffer." );
+ }
+
+ refCount ++;
+ }
+
+ /**
+ * Releases the specified buffer to buffer pool.
+ *
+ * @throws IllegalStateException if you attempt to release already
+ * released buffer.
+ */
+ public synchronized void release()
+ {
+ if( refCount <= 0 )
+ {
+ refCount = 0;
+ throw new IllegalStateException(
+ "Already released buffer. You released the buffer too many times." );
+ }
+
+ refCount --;
+ if( refCount > 0)
+ {
+ return;
+ }
+
+ Stack stack = bufferStacks[ getBufferStackIndex( buf.capacity() ) ];
+ synchronized( stack )
+ {
+ // push back
+ stack.push( this );
+ }
}
/**
Modified: directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java?view=diff&r1=157369&r2=157370
==============================================================================
--- directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java (original)
+++ directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java Sun Mar 13 19:11:37 2005
@@ -282,7 +282,7 @@
}
finally
{
- ByteBuffer.release( readBuf );
+ readBuf.release();
}
}
@@ -345,7 +345,7 @@
try
{
- ByteBuffer.release( buf );
+ buf.release();
}
catch( IllegalStateException e )
{
Modified: directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java?view=diff&r1=157369&r2=157370
==============================================================================
--- directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java (original)
+++ directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java Sun Mar 13 19:11:37 2005
@@ -259,7 +259,7 @@
}
finally
{
- ByteBuffer.release( readBuf );
+ readBuf.release();
}
}
@@ -322,7 +322,7 @@
try
{
- ByteBuffer.release( buf );
+ buf.release();
}
catch( IllegalStateException e )
{
Modified: directory/network/mina/trunk/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java
URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java?view=diff&r1=157369&r2=157370
==============================================================================
--- directory/network/mina/trunk/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java (original)
+++ directory/network/mina/trunk/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java Sun Mar 13 19:11:37 2005
@@ -222,6 +222,8 @@
public void dataRead( IoHandler nextHandler, IoSession session,
ByteBuffer buf )
{
+ // MINA will release the buffer if this method returns.
+ buf.acquire();
fireEvent( nextHandler, session, EventType.READ, buf );
}
@@ -421,7 +423,9 @@
{
if( type == EventType.READ )
{
- nextHandler.dataRead( session, ( ByteBuffer ) data );
+ ByteBuffer buf = ( ByteBuffer ) data;
+ nextHandler.dataRead( session, buf );
+ buf.release();
}
else if( type == EventType.WRITTEN )
{
Modified: directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java
URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java?view=diff&r1=157369&r2=157370
==============================================================================
--- directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java (original)
+++ directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java Sun Mar 13 19:11:37 2005
@@ -420,7 +420,7 @@
}
try
{
- ByteBuffer.release( buf );
+ buf.release();
}
catch( IllegalStateException e )
{
Modified: directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketSession.java
URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketSession.java?view=diff&r1=157369&r2=157370
==============================================================================
--- directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketSession.java (original)
+++ directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketSession.java Sun Mar 13 19:11:37 2005
@@ -126,7 +126,7 @@
return;
}
disposed = true;
- ByteBuffer.release( readBuf );
+ readBuf.release();
}
public IoHandler getHandler()
Modified: directory/network/mina/trunk/src/java/org/apache/mina/protocol/codec/NettyEncoder.java
URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/org/apache/mina/protocol/codec/NettyEncoder.java?view=diff&r1=157369&r2=157370
==============================================================================
--- directory/network/mina/trunk/src/java/org/apache/mina/protocol/codec/NettyEncoder.java (original)
+++ directory/network/mina/trunk/src/java/org/apache/mina/protocol/codec/NettyEncoder.java Sun Mar 13 19:11:37 2005
@@ -56,7 +56,7 @@
}
else
{
- ByteBuffer.release( buf );
+ buf.release();
}
}
}
Modified: directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java
URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java?view=diff&r1=157369&r2=157370
==============================================================================
--- directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java (original)
+++ directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java Sun Mar 13 19:11:37 2005
@@ -55,8 +55,6 @@
*/
public class IoAdapter
{
- public static final Class IO_HANDLER_TYPE = SessionHandlerAdapter.class;
-
private final ProtocolHandlerFilterManager filterManager = new ProtocolHandlerFilterManager();
IoAdapter()
@@ -193,7 +191,7 @@
{
try
{
- ByteBuffer.release( in );
+ in.release();
}
catch( IllegalStateException e )
{
@@ -454,7 +452,7 @@
}
newBuf.put( buf );
- ByteBuffer.release( buf );
+ buf.release();
}
// Push the new buffer finally.
Modified: directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFilterManager.java
URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFilterManager.java?view=diff&r1=157369&r2=157370
==============================================================================
--- directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFilterManager.java (original)
+++ directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFilterManager.java Sun Mar 13 19:11:37 2005
@@ -26,7 +26,6 @@
import org.apache.mina.io.IoHandler;
import org.apache.mina.io.IoHandlerFilter;
import org.apache.mina.io.IoSession;
-import org.apache.mina.protocol.io.IoAdapter;
/**
* Manages the list of {@link IoHandlerFilter}s.
@@ -66,11 +65,7 @@
{
IoHandler handler = session.getHandler();
handler.dataRead( session, buf );
- if( !IoAdapter.IO_HANDLER_TYPE.isAssignableFrom( handler
- .getClass() ) )
- {
- ByteBuffer.release( buf );
- }
+ buf.release();
}
public void dataWritten( IoHandler nextHandler, IoSession session,
@@ -259,7 +254,7 @@
{
// Original buffer is replaced with new filtered buffer;
// let's release the old one.
- ByteBuffer.release( buf );
+ buf.release();
}
else if( newBuf == null )
{
Modified: directory/network/mina/trunk/src/test/org/apache/mina/common/ByteBufferTest.java
URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/test/org/apache/mina/common/ByteBufferTest.java?view=diff&r1=157369&r2=157370
==============================================================================
--- directory/network/mina/trunk/src/test/org/apache/mina/common/ByteBufferTest.java (original)
+++ directory/network/mina/trunk/src/test/org/apache/mina/common/ByteBufferTest.java Sun Mar 13 19:11:37 2005
@@ -49,22 +49,42 @@
Assert.assertEquals( buf.capacity(), buf.remaining() );
Assert.assertTrue( buf.capacity() >= i );
Assert.assertTrue( buf.capacity() < i * 2 );
- ByteBuffer.release( buf );
+ buf.release();
}
}
public void testLeakageDetection() throws Exception
{
ByteBuffer buf = ByteBuffer.allocate( 1024 );
- ByteBuffer.release( buf );
+ buf.release();
try
{
- ByteBuffer.release( buf );
+ buf.release();
Assert.fail( "Releasing a buffer twice should fail." );
}
catch( IllegalStateException e )
{
+ }
+ }
+
+ public void testAcquireRelease() throws Exception
+ {
+ ByteBuffer buf = ByteBuffer.allocate( 1024 );
+ buf.acquire();
+ buf.release();
+ buf.acquire();
+ buf.acquire();
+ buf.release();
+ buf.release();
+ buf.release();
+ try
+ {
+ buf.release();
+ Assert.fail( "Releasing a buffer twice should fail." );
+ }
+ catch( IllegalStateException e )
+ {
}
}
}