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/04/19 10:29:29 UTC
svn commit: r161856 - in directory/network/trunk/src:
java/org/apache/mina/common/ByteBuffer.java
test/org/apache/mina/common/ByteBufferTest.java
Author: trustin
Date: Tue Apr 19 01:29:28 2005
New Revision: 161856
URL: http://svn.apache.org/viewcvs?view=rev&rev=161856
Log:
* Added ByteBuffer.isDirect() and isReadOnly();
* ByteBuffer.duplicate(), slice() and asReadOnly() returns MINA ByteBuffer now.
Modified:
directory/network/trunk/src/java/org/apache/mina/common/ByteBuffer.java
directory/network/trunk/src/test/org/apache/mina/common/ByteBufferTest.java
Modified: directory/network/trunk/src/java/org/apache/mina/common/ByteBuffer.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/common/ByteBuffer.java?view=diff&r1=161855&r2=161856
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/common/ByteBuffer.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/common/ByteBuffer.java Tue Apr 19 01:29:28 2005
@@ -177,7 +177,11 @@
* Returns the underlying NIO buffer instance.
*/
public abstract java.nio.ByteBuffer buf();
-
+
+ public abstract boolean isDirect();
+
+ public abstract boolean isReadOnly();
+
public abstract int capacity();
public abstract int position();
@@ -202,11 +206,11 @@
public abstract boolean hasRemaining();
- public abstract java.nio.ByteBuffer slice();
+ public abstract ByteBuffer slice();
- public abstract java.nio.ByteBuffer duplicate();
+ public abstract ByteBuffer duplicate();
- public abstract java.nio.ByteBuffer asReadOnlyBuffer();
+ public abstract ByteBuffer asReadOnlyBuffer();
public abstract byte get();
@@ -422,13 +426,11 @@
*/
public abstract ByteBuffer fork( int newCapacity );
- private static class DefaultByteBuffer extends ByteBuffer
+ private static abstract class BaseByteBuffer extends ByteBuffer
{
private final java.nio.ByteBuffer buf;
- private int refCount = 1;
-
- private DefaultByteBuffer( java.nio.ByteBuffer buf )
+ protected BaseByteBuffer( java.nio.ByteBuffer buf )
{
if( buf == null )
{
@@ -437,60 +439,19 @@
this.buf = buf;
}
- private DefaultByteBuffer( int capacity, boolean direct )
+ public java.nio.ByteBuffer buf()
{
- if( direct )
- {
- buf = java.nio.ByteBuffer.allocateDirect( capacity );
- }
- else
- {
- buf = java.nio.ByteBuffer.allocate( capacity );
- }
+ return buf;
}
- private synchronized void resetRefCount()
+ public boolean isDirect()
{
- refCount = 1;
+ return buf.isDirect();
}
- public synchronized void acquire()
+ public boolean isReadOnly()
{
- if( refCount <= 0 )
- {
- throw new IllegalStateException( "Already released buffer." );
- }
-
- refCount ++;
- }
-
- 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[] bufferStacks = buf.isDirect()? directBufferStacks : heapBufferStacks;
- Stack stack = bufferStacks[ getBufferStackIndex( bufferStacks, buf.capacity() ) ];
- synchronized( stack )
- {
- // push back
- stack.push( this );
- }
- }
-
- public java.nio.ByteBuffer buf()
- {
- return buf;
+ return buf.isReadOnly();
}
public int capacity()
@@ -560,19 +521,19 @@
return buf.hasRemaining();
}
- public java.nio.ByteBuffer slice()
+ public ByteBuffer slice()
{
- return buf.slice();
+ return new DuplicateByteBuffer( this, buf.slice());
}
- public java.nio.ByteBuffer duplicate()
+ public ByteBuffer duplicate()
{
- return buf.duplicate();
+ return new DuplicateByteBuffer( this, buf.duplicate() );
}
- public java.nio.ByteBuffer asReadOnlyBuffer()
+ public ByteBuffer asReadOnlyBuffer()
{
- return buf.asReadOnlyBuffer();
+ return new DuplicateByteBuffer( this, buf.asReadOnlyBuffer() );
}
public byte get()
@@ -1144,6 +1105,80 @@
throw new IllegalArgumentException(
"fieldSize cannot be negative: " + fieldSize );
}
+ }
+ }
+
+ private static class DefaultByteBuffer extends BaseByteBuffer
+ {
+ private int refCount = 1;
+
+ protected DefaultByteBuffer( java.nio.ByteBuffer buf )
+ {
+ super( buf );
+ }
+
+ protected DefaultByteBuffer( int capacity, boolean direct )
+ {
+ super( direct? java.nio.ByteBuffer.allocateDirect( capacity ) :
+ java.nio.ByteBuffer.allocate( capacity ) );
+ }
+
+ private synchronized void resetRefCount()
+ {
+ refCount = 1;
+ }
+
+ public synchronized void acquire()
+ {
+ if( refCount <= 0 )
+ {
+ throw new IllegalStateException( "Already released buffer." );
+ }
+
+ refCount ++;
+ }
+
+ 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[] bufferStacks = isDirect()? directBufferStacks : heapBufferStacks;
+ Stack stack = bufferStacks[ getBufferStackIndex( bufferStacks, capacity() ) ];
+ synchronized( stack )
+ {
+ // push back
+ stack.push( this );
+ }
+ }
+ }
+
+ private static class DuplicateByteBuffer extends BaseByteBuffer
+ {
+ private ByteBuffer buf;
+
+ private DuplicateByteBuffer( ByteBuffer buf, java.nio.ByteBuffer duplicateBuf )
+ {
+ super( duplicateBuf );
+ this.buf = buf;
+ }
+
+ public void acquire() {
+ buf.acquire();
+ }
+
+ public void release() {
+ buf.release();
}
}
}
Modified: directory/network/trunk/src/test/org/apache/mina/common/ByteBufferTest.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/test/org/apache/mina/common/ByteBufferTest.java?view=diff&r1=161855&r2=161856
==============================================================================
--- directory/network/trunk/src/test/org/apache/mina/common/ByteBufferTest.java (original)
+++ directory/network/trunk/src/test/org/apache/mina/common/ByteBufferTest.java Tue Apr 19 01:29:28 2005
@@ -185,4 +185,16 @@
Assert.assertEquals( buf.get( i ), newBuf.get( i ) );
}
}
+
+ public void testDuplication()
+ {
+ ByteBuffer buf = ByteBuffer.allocate( 16 );
+ buf.fillAndReset( buf.remaining() );
+
+ ByteBuffer buf2 = buf.duplicate();
+ buf.putInt( 1234 );
+ Assert.assertEquals( 4, buf.position() );
+ Assert.assertEquals( 0, buf2.position() );
+ Assert.assertEquals( 1234, buf2.getInt() );
+ }
}