Return-Path: Delivered-To: apmail-incubator-directory-cvs-archive@www.apache.org Received: (qmail 50514 invoked from network); 14 Mar 2005 03:11:46 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 14 Mar 2005 03:11:46 -0000 Received: (qmail 35716 invoked by uid 500); 14 Mar 2005 03:11:46 -0000 Delivered-To: apmail-incubator-directory-cvs-archive@incubator.apache.org Received: (qmail 35669 invoked by uid 500); 14 Mar 2005 03:11:45 -0000 Mailing-List: contact directory-cvs-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: directory-dev@incubator.apache.org Delivered-To: mailing list directory-cvs@incubator.apache.org Received: (qmail 35655 invoked by uid 99); 14 Mar 2005 03:11:45 -0000 X-ASF-Spam-Status: No, hits=-9.8 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from minotaur.apache.org (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Sun, 13 Mar 2005 19:11:44 -0800 Received: (qmail 50404 invoked by uid 65534); 14 Mar 2005 03:11:41 -0000 Message-ID: <20050314031141.50401.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Mailer: svnmailer-1.0.0-dev Date: Mon, 14 Mar 2005 03:11:41 -0000 Subject: 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/ To: directory-cvs@incubator.apache.org From: trustin@apache.org X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N Author: trustin Date: Sun Mar 13 19:11:37 2005 New Revision: 157370 URL: http://svn.apache.org/viewcvs?view=3Drev&rev=3D157370 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/Datag= ramAcceptor.java directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/Datag= ramConnector.java directory/network/mina/trunk/src/java/org/apache/mina/io/filter/IoThrea= dPoolFilter.java directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketI= oProcessor.java directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketS= ession.java directory/network/mina/trunk/src/java/org/apache/mina/protocol/codec/Ne= ttyEncoder.java directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAda= pter.java directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFil= terManager.java directory/network/mina/trunk/src/test/org/apache/mina/common/ByteBuffer= Test.java Modified: directory/network/mina/trunk/src/java/org/apache/mina/common/Byte= Buffer.java URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/or= g/apache/mina/common/ByteBuffer.java?view=3Ddiff&r1=3D157369&r2=3D157370 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- 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 @@ } =20 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 =3D true; + buf.refCount =3D 1; } =20 return buf; } =20 - /** - * Returns the specified buffer to buffer pool. - */ - public static void release( ByteBuffer buf ) - { - Stack stack =3D bufferStacks[ getBufferStackIndex( buf.capacity() = ) ]; - synchronized( stack ) - { - // Check leaked or dangling ByteBuffer. - if( !buf.inUse ) - { - throw new IllegalStateException( - "Already released buffer. Did you release the buf= fer more than once?" ); - } - else - { - buf.inUse =3D false; // clear the flag - } - - stack.push( buf ); - } - } - private static int getBufferStackIndex( int size ) { int targetSize =3D 16; @@ -155,11 +126,58 @@ =20 private final java.nio.ByteBuffer buf; =20 - private boolean inUse; + private int refCount =3D 1; =20 private ByteBuffer( java.nio.ByteBuffer buf ) { this.buf =3D buf; + } + =20 + /** + * 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. + *=20 + * @throws IllegalStateException if you attempt to acquire already + * released buffer. + */ + public synchronized void acquire() + { + if( refCount <=3D 0 ) + { + throw new IllegalStateException( "Already released buffer." ); + } + + refCount ++; + } + + /** + * Releases the specified buffer to buffer pool. + *=20 + * @throws IllegalStateException if you attempt to release already + * released buffer. + */ + public synchronized void release() + { + if( refCount <=3D 0 ) + { + refCount =3D 0; + throw new IllegalStateException( + "Already released buffer. You released the buffer too= many times." ); + } + + refCount --; + if( refCount > 0) + { + return; + } + + Stack stack =3D bufferStacks[ getBufferStackIndex( buf.capacity() = ) ]; + synchronized( stack ) + { + // push back + stack.push( this ); + } } =20 /** 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/or= g/apache/mina/io/datagram/DatagramAcceptor.java?view=3Ddiff&r1=3D157369&r2= =3D157370 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/Datag= ramAcceptor.java (original) +++ directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/Datag= ramAcceptor.java Sun Mar 13 19:11:37 2005 @@ -282,7 +282,7 @@ } finally { - ByteBuffer.release( readBuf ); + readBuf.release(); } } =20 @@ -345,7 +345,7 @@ =20 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/or= g/apache/mina/io/datagram/DatagramConnector.java?view=3Ddiff&r1=3D157369&r2= =3D157370 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/Datag= ramConnector.java (original) +++ directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/Datag= ramConnector.java Sun Mar 13 19:11:37 2005 @@ -259,7 +259,7 @@ } finally { - ByteBuffer.release( readBuf ); + readBuf.release(); } } =20 @@ -322,7 +322,7 @@ =20 try { - ByteBuffer.release( buf ); + buf.release(); } catch( IllegalStateException e ) { Modified: directory/network/mina/trunk/src/java/org/apache/mina/io/filter/I= oThreadPoolFilter.java URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/or= g/apache/mina/io/filter/IoThreadPoolFilter.java?view=3Ddiff&r1=3D157369&r2= =3D157370 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- directory/network/mina/trunk/src/java/org/apache/mina/io/filter/IoThrea= dPoolFilter.java (original) +++ directory/network/mina/trunk/src/java/org/apache/mina/io/filter/IoThrea= dPoolFilter.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 ); } =20 @@ -421,7 +423,9 @@ { if( type =3D=3D EventType.READ ) { - nextHandler.dataRead( session, ( ByteBuffer ) data ); + ByteBuffer buf =3D ( ByteBuffer ) data; + nextHandler.dataRead( session, buf ); + buf.release(); } else if( type =3D=3D EventType.WRITTEN ) { Modified: directory/network/mina/trunk/src/java/org/apache/mina/io/socket/S= ocketIoProcessor.java URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/or= g/apache/mina/io/socket/SocketIoProcessor.java?view=3Ddiff&r1=3D157369&r2= =3D157370 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketI= oProcessor.java (original) +++ directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketI= oProcessor.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/S= ocketSession.java URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/or= g/apache/mina/io/socket/SocketSession.java?view=3Ddiff&r1=3D157369&r2=3D157= 370 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketS= ession.java (original) +++ directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketS= ession.java Sun Mar 13 19:11:37 2005 @@ -126,7 +126,7 @@ return; } disposed =3D true; - ByteBuffer.release( readBuf ); + readBuf.release(); } =20 public IoHandler getHandler() Modified: directory/network/mina/trunk/src/java/org/apache/mina/protocol/co= dec/NettyEncoder.java URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/or= g/apache/mina/protocol/codec/NettyEncoder.java?view=3Ddiff&r1=3D157369&r2= =3D157370 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- directory/network/mina/trunk/src/java/org/apache/mina/protocol/codec/Ne= ttyEncoder.java (original) +++ directory/network/mina/trunk/src/java/org/apache/mina/protocol/codec/Ne= ttyEncoder.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/or= g/apache/mina/protocol/io/IoAdapter.java?view=3Ddiff&r1=3D157369&r2=3D157370 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAda= pter.java (original) +++ directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAda= pter.java Sun Mar 13 19:11:37 2005 @@ -55,8 +55,6 @@ */ public class IoAdapter { - public static final Class IO_HANDLER_TYPE =3D SessionHandlerAdapter.cl= ass; - private final ProtocolHandlerFilterManager filterManager =3D new Proto= colHandlerFilterManager(); =20 IoAdapter() @@ -193,7 +191,7 @@ { try { - ByteBuffer.release( in ); + in.release(); } catch( IllegalStateException e ) { @@ -454,7 +452,7 @@ } =20 newBuf.put( buf ); - ByteBuffer.release( buf ); + buf.release(); } =20 // Push the new buffer finally. Modified: directory/network/mina/trunk/src/java/org/apache/mina/util/IoHand= lerFilterManager.java URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/or= g/apache/mina/util/IoHandlerFilterManager.java?view=3Ddiff&r1=3D157369&r2= =3D157370 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFil= terManager.java (original) +++ directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFil= terManager.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; =20 /** * Manages the list of {@link IoHandlerFilter}s. @@ -66,11 +65,7 @@ { IoHandler handler =3D session.getHandler(); handler.dataRead( session, buf ); - if( !IoAdapter.IO_HANDLER_TYPE.isAssignableFrom( handler - .getClass() ) ) - { - ByteBuffer.release( buf ); - } + buf.release(); } =20 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 =3D=3D null ) { Modified: directory/network/mina/trunk/src/test/org/apache/mina/common/Byte= BufferTest.java URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/test/or= g/apache/mina/common/ByteBufferTest.java?view=3Ddiff&r1=3D157369&r2=3D157370 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- directory/network/mina/trunk/src/test/org/apache/mina/common/ByteBuffer= Test.java (original) +++ directory/network/mina/trunk/src/test/org/apache/mina/common/ByteBuffer= Test.java Sun Mar 13 19:11:37 2005 @@ -49,22 +49,42 @@ Assert.assertEquals( buf.capacity(), buf.remaining() ); Assert.assertTrue( buf.capacity() >=3D i ); Assert.assertTrue( buf.capacity() < i * 2 ); - ByteBuffer.release( buf ); + buf.release(); } } =20 public void testLeakageDetection() throws Exception { ByteBuffer buf =3D 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 ) { =20 + } + } + =20 + public void testAcquireRelease() throws Exception + { + ByteBuffer buf =3D 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 ) + { } } }