You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by bl...@apache.org on 2004/12/14 21:07:46 UTC
svn commit: r111867 - in incubator/directory/protocol-api/trunk/src: java/org/apache/protocol/bufferpool test/org/apache/protocol/bufferpool test/org/apache/protocol/bufferpool/test
Author: bloritsch
Date: Tue Dec 14 12:07:43 2004
New Revision: 111867
URL: http://svn.apache.org/viewcvs?view=rev&rev=111867
Log:
Add the BufferPool to the protocol API because protocols would need to use new buffers for the encoding cycle.
Added:
incubator/directory/protocol-api/trunk/src/java/org/apache/protocol/bufferpool/
incubator/directory/protocol-api/trunk/src/java/org/apache/protocol/bufferpool/BufferPool.java
incubator/directory/protocol-api/trunk/src/test/org/apache/protocol/bufferpool/
incubator/directory/protocol-api/trunk/src/test/org/apache/protocol/bufferpool/test/
incubator/directory/protocol-api/trunk/src/test/org/apache/protocol/bufferpool/test/TestBufferPool.java
Added: incubator/directory/protocol-api/trunk/src/java/org/apache/protocol/bufferpool/BufferPool.java
Url: http://svn.apache.org/viewcvs/incubator/directory/protocol-api/trunk/src/java/org/apache/protocol/bufferpool/BufferPool.java?view=auto&rev=111867
==============================================================================
--- (empty file)
+++ incubator/directory/protocol-api/trunk/src/java/org/apache/protocol/bufferpool/BufferPool.java Tue Dec 14 12:07:43 2004
@@ -0,0 +1,86 @@
+/*
+ * 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.protocol.bufferpool;
+
+import java.nio.ByteBuffer;
+import java.util.LinkedList;
+import java.lang.ref.WeakReference;
+
+/**
+ * Provide a tested and working ByteBuffer pool that uses WeakReferences
+ * so that old buffers can automatically be cleaned up by garbage
+ * collection.
+ */
+public class BufferPool
+{
+ private static final int KILOBYTE = 1024;
+ private static int m_usedBuffers;
+ private static final LinkedList m_reserveBuffers = new LinkedList();
+
+ /**
+ * Get an unused ByteBuffer.
+ *
+ * @return an unused ByteBuffer.
+ */
+ public static ByteBuffer getBuffer()
+ {
+ ByteBuffer buffer = null;
+ while (null == buffer && m_reserveBuffers.size() > 0)
+ {
+ final WeakReference ref = (WeakReference)m_reserveBuffers.removeFirst();
+ buffer = (ByteBuffer)ref.get();
+ }
+
+ if ( buffer == null )
+ {
+ buffer = createBuffer();
+ }
+
+ m_usedBuffers++;
+
+ return buffer;
+ }
+
+ private static ByteBuffer createBuffer()
+ {
+ return ByteBuffer.allocateDirect( KILOBYTE );
+ }
+
+ public static int buffersInUse()
+ {
+ return m_usedBuffers;
+ }
+
+ public static void putBuffer( final ByteBuffer buffer )
+ {
+ m_usedBuffers--;
+ assert buffer.isDirect() && KILOBYTE == buffer.capacity() : "The provided buffer could not have been from this pool.";
+ buffer.clear();
+ m_reserveBuffers.add( new WeakReference(buffer) );
+ }
+
+ public static int buffersInReserve()
+ {
+ return m_reserveBuffers.size();
+ }
+
+ public static void reset()
+ {
+ m_usedBuffers = 0;
+ m_reserveBuffers.clear();
+ }
+}
Added: incubator/directory/protocol-api/trunk/src/test/org/apache/protocol/bufferpool/test/TestBufferPool.java
Url: http://svn.apache.org/viewcvs/incubator/directory/protocol-api/trunk/src/test/org/apache/protocol/bufferpool/test/TestBufferPool.java?view=auto&rev=111867
==============================================================================
--- (empty file)
+++ incubator/directory/protocol-api/trunk/src/test/org/apache/protocol/bufferpool/test/TestBufferPool.java Tue Dec 14 12:07:43 2004
@@ -0,0 +1,127 @@
+/*
+ * 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.protocol.bufferpool.test;
+
+import junit.framework.TestCase;
+
+import java.nio.ByteBuffer;
+
+import org.apache.protocol.bufferpool.BufferPool;
+
+
+/**
+ * Created by IntelliJ IDEA. User: berin Date: Dec 9, 2004 Time: 9:40:14
+ * AM To change this template use File | Settings | File Templates.
+ */
+public class TestBufferPool extends TestCase
+{
+ private static final int KB = 1024;
+ private static final int TOO_SMALL = 256;
+
+ public TestBufferPool(final String name)
+ {
+ super(name);
+ }
+
+ public void tearDown() throws Exception
+ {
+ super.tearDown();
+
+ BufferPool.reset();
+ }
+
+ public void testGetBuffer()
+ {
+ final ByteBuffer buffer = BufferPool.getBuffer();
+
+ assertNotNull(buffer);
+ assertEquals(KB, buffer.capacity());
+ assertTrue( buffer.isDirect() );
+ assertEquals( 1, BufferPool.buffersInUse() );
+
+ BufferPool.putBuffer(buffer);
+ }
+
+ public void testPutBuffer()
+ {
+ final ByteBuffer buffer = BufferPool.getBuffer();
+ assertEquals( 1, BufferPool.buffersInUse() );
+ assertEquals( 0, BufferPool.buffersInReserve() );
+
+ BufferPool.putBuffer(buffer);
+ assertEquals( 0, BufferPool.buffersInUse() );
+ assertEquals( 1, BufferPool.buffersInReserve() );
+ }
+
+ public void testBuffersInReserve()
+ {
+ assertEquals( 0, BufferPool.buffersInReserve() );
+
+ final ByteBuffer buffer1 = BufferPool.getBuffer();
+ BufferPool.putBuffer( buffer1 );
+
+ assertEquals( 1, BufferPool.buffersInReserve() );
+
+ final ByteBuffer buffer2 = BufferPool.getBuffer();
+
+ assertEquals( 0, BufferPool.buffersInReserve() );
+
+ BufferPool.putBuffer( buffer2 );
+
+ assertEquals( 1, BufferPool.buffersInReserve() );
+ }
+
+ public void testPutBuffer_notDirect()
+ {
+ boolean assertionsEnabled = false;
+ assert assertionsEnabled = true;
+
+ if (assertionsEnabled)
+ {
+ try
+ {
+ BufferPool.putBuffer( ByteBuffer.allocate( KB ) );
+ fail("Did not throw AssertionError as expected.");
+ }
+ catch (Error e)
+ {
+ assertTrue("Caught error, but not the expected type" + e, e instanceof AssertionError);
+ if ( ! (e instanceof AssertionError ) ) throw e;
+ }
+ }
+ }
+
+ public void testPutBuffer_tooSmall()
+ {
+ boolean assertionsEnabled = false;
+ assert assertionsEnabled = true;
+
+ if (assertionsEnabled)
+ {
+ try
+ {
+ BufferPool.putBuffer( ByteBuffer.allocateDirect( TOO_SMALL ) );
+ fail("Did not throw AssertionError as expected.");
+ }
+ catch (Error e)
+ {
+ assertTrue("Caught error, but not the expected type" + e, e instanceof AssertionError);
+ if ( ! (e instanceof AssertionError ) ) throw e;
+ }
+ }
+ }
+}