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 2004/12/25 05:54:09 UTC
svn commit: r123313 - in incubator/directory/network/trunk/mina/src: examples/org/apache/mina/examples/echoserver examples/org/apache/mina/examples/reverser java/org/apache/mina/io/datagram java/org/apache/mina/io/socket java/org/apache/mina/util
Author: trustin
Date: Fri Dec 24 20:54:07 2004
New Revision: 123313
URL: http://svn.apache.org/viewcvs?view=rev&rev=123313
Log:
* Made ByteBufferPool to be able to allocate buffers with various sizes
Modified:
incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java
incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java
incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java
incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java
incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java
incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSessionConfig.java
incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ByteBufferPool.java
Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java?view=diff&rev=123313&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java&r1=123312&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java&r2=123313
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java (original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java Fri Dec 24 20:54:07 2004
@@ -23,6 +23,7 @@
import org.apache.mina.common.IdleStatus;
import org.apache.mina.io.IoHandler;
import org.apache.mina.io.IoSession;
+import org.apache.mina.util.ByteBufferPool;
/**
* TODO Document me.
@@ -59,18 +60,20 @@
public void dataRead( IoSession session, ByteBuffer rb )
{
- ByteBuffer wb = ByteBuffer.allocate( rb.remaining() );
+ ByteBuffer wb = ByteBufferPool.allocate( rb.remaining() );
wb.put( rb );
wb.flip();
System.out.println( Thread.currentThread().getName() + ' '
+ session.getRemoteAddress() + ": READ ("
+ wb.remaining() + "B)" );
- session.write( wb, null );
+ session.write( wb, wb );
}
public void dataWritten( IoSession IoSession, Object marker )
{
System.out.println( Thread.currentThread().getName() + ' '
+ IoSession.getRemoteAddress() + ": WRITTEN" );
+
+ ByteBufferPool.release( ( ByteBuffer ) marker );
}
}
Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java?view=diff&rev=123313&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java&r1=123312&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java&r2=123313
==============================================================================
--- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java (original)
+++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java Fri Dec 24 20:54:07 2004
@@ -24,6 +24,7 @@
import org.apache.mina.protocol.ProtocolEncoderOutput;
import org.apache.mina.protocol.ProtocolSession;
import org.apache.mina.protocol.ProtocolViolationException;
+import org.apache.mina.util.ByteBufferPool;
/**
* TODO Document me.
@@ -48,7 +49,7 @@
val += "\r\n";
- ByteBuffer buf = ByteBuffer.allocate( val.length() );
+ ByteBuffer buf = ByteBufferPool.allocate( val.length() );
for( int i = 0; i < val.length(); i++ )
{
buf.put( ( byte ) val.charAt( i ) );
Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java?view=diff&rev=123313&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java&r1=123312&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java&r2=123313
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java (original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java Fri Dec 24 20:54:07 2004
@@ -35,6 +35,7 @@
import org.apache.mina.io.ExceptionMonitor;
import org.apache.mina.io.IoHandler;
import org.apache.mina.io.IoHandlerFilter;
+import org.apache.mina.util.ByteBufferPool;
import org.apache.mina.util.DefaultExceptionMonitor;
import org.apache.mina.util.IoHandlerFilterManager;
import org.apache.mina.util.Queue;
@@ -244,7 +245,7 @@
private void readSession( DatagramSession session )
{
- ByteBuffer readBuf = ByteBuffer.allocate( 1500 );
+ ByteBuffer readBuf = ByteBufferPool.allocate( 2048 );
try
{
SocketAddress remoteAddress = session.getChannel()
Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java?view=diff&rev=123313&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java&r1=123312&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java&r2=123313
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java (original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramConnector.java Fri Dec 24 20:54:07 2004
@@ -34,6 +34,7 @@
import org.apache.mina.io.IoHandler;
import org.apache.mina.io.IoHandlerFilter;
import org.apache.mina.io.IoSession;
+import org.apache.mina.util.ByteBufferPool;
import org.apache.mina.util.DefaultExceptionMonitor;
import org.apache.mina.util.IoHandlerFilterManager;
import org.apache.mina.util.Queue;
@@ -238,7 +239,7 @@
private void readSession( DatagramSession session )
{
- ByteBuffer readBuf = ByteBuffer.allocate( 1500 );
+ ByteBuffer readBuf = ByteBufferPool.allocate( 2048 );
try
{
int readBytes = session.getChannel().read( readBuf );
Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java?view=diff&rev=123313&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java&r1=123312&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java&r2=123313
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java (original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java Fri Dec 24 20:54:07 2004
@@ -29,7 +29,6 @@
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.SessionConfig;
import org.apache.mina.io.WriteTimeoutException;
-import org.apache.mina.util.ByteBufferPool;
import org.apache.mina.util.Queue;
/**
@@ -148,8 +147,6 @@
try
{
ch.configureBlocking( false );
- ch.socket().setSendBufferSize( ByteBufferPool.CAPACITY );
- ch.socket().setReceiveBufferSize( ByteBufferPool.CAPACITY );
session.setSelectionKey( ch.register( selector,
SelectionKey.OP_READ,
session ) );
Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java?view=diff&rev=123313&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java&r1=123312&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java&r2=123313
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java (original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java Fri Dec 24 20:54:07 2004
@@ -84,7 +84,7 @@
this.filterManager = filterManager;
this.ch = ch;
this.config = new SocketSessionConfig( ch );
- this.readBuf = ( ByteBuffer ) ByteBufferPool.open().limit( 0 );
+ this.readBuf = ( ByteBuffer ) ByteBufferPool.allocate( 4096 ).limit( 0 );
this.writeBufferQueue = new Queue();
this.writeMarkerQueue = new Queue();
this.handler = defaultHandler;
@@ -114,7 +114,7 @@
void dispose()
{
- ByteBufferPool.close( readBuf );
+ ByteBufferPool.release( readBuf );
}
public IoHandler getHandler()
Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSessionConfig.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSessionConfig.java?view=diff&rev=123313&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSessionConfig.java&r1=123312&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSessionConfig.java&r2=123313
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSessionConfig.java (original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSessionConfig.java Fri Dec 24 20:54:07 2004
@@ -97,4 +97,24 @@
{
ch.socket().setTrafficClass( tc );
}
+
+ public int getSendBufferSize() throws SocketException
+ {
+ return ch.socket().getSendBufferSize();
+ }
+
+ public void setSendBufferSize( int size ) throws SocketException
+ {
+ ch.socket().setSendBufferSize( size );
+ }
+
+ public int getReceiveBufferSize() throws SocketException
+ {
+ return ch.socket().getReceiveBufferSize();
+ }
+
+ public void setReceiveBufferSize( int size ) throws SocketException
+ {
+ ch.socket().setReceiveBufferSize( size );
+ }
}
Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ByteBufferPool.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ByteBufferPool.java?view=diff&rev=123313&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ByteBufferPool.java&r1=123312&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ByteBufferPool.java&r2=123313
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ByteBufferPool.java (original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/ByteBufferPool.java Fri Dec 24 20:54:07 2004
@@ -28,28 +28,90 @@
*/
public class ByteBufferPool
{
- public static final int CAPACITY = 8192;
-
- private static Queue buffers = new Queue();
-
- public static synchronized ByteBuffer open()
+ private static final int[] bufferStackSizes = new int[] {
+ 16,
+ 32,
+ 64,
+ 128,
+ 256,
+ 512,
+ 1024,
+ 2048,
+ 3072,
+ 4096,
+ 6144,
+ 8192,
+ };
+
+ private static final Stack[] bufferStacks = new Stack[] {
+ new Stack(),
+ new Stack(),
+ new Stack(),
+ new Stack(),
+ new Stack(),
+ new Stack(),
+ new Stack(),
+ new Stack(),
+ new Stack(),
+ new Stack(),
+ new Stack(),
+ new Stack(),
+ };
+
+ public static ByteBuffer allocate(int size)
{
- ByteBuffer buf = ( ByteBuffer ) buffers.pop();
-
- if( buf == null )
- {
- buf = ByteBuffer.allocateDirect( CAPACITY );
- }
- else
- {
- buf.clear();
- }
-
- return buf;
+ int idx = getBufferStackIndex(size);
+ Stack stack = bufferStacks[idx];
+
+ ByteBuffer buf;
+ synchronized (stack)
+ {
+ buf = (ByteBuffer) stack.pop();
+ if (buf == null)
+ {
+ buf = ByteBuffer.allocate( bufferStackSizes[ idx ] );
+ }
+ }
+
+ buf.clear();
+ return buf;
}
- public static synchronized void close( ByteBuffer buf )
+ public static void release( ByteBuffer buf )
{
- buffers.push( buf );
+ Stack stack = bufferStacks[ getBufferStackIndex( buf.capacity() ) ];
+ synchronized (stack)
+ {
+ stack.push( buf );
+ }
+ }
+
+ private static int getBufferStackIndex(int size) {
+ if (size <= 16)
+ return 0;
+ if (size <= 32)
+ return 1;
+ if (size <= 64)
+ return 2;
+ if (size <= 128)
+ return 3;
+ if (size <= 256)
+ return 4;
+ if (size <= 512)
+ return 5;
+ if (size <= 1024)
+ return 6;
+ if (size <= 2048)
+ return 7;
+ if (size <= 3072)
+ return 8;
+ if (size <= 4096)
+ return 9;
+ if (size <= 6144)
+ return 10;
+ if (size <= 8192)
+ return 11;
+
+ throw new IllegalArgumentException("Buffer size cannot exceed 8192: " + size);
}
}