You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by el...@apache.org on 2010/01/14 19:20:48 UTC
svn commit: r899343 -
/mina/trunk/core/src/main/java/org/apache/mina/core/buffer/CachedBufferAllocator.java
Author: elecharny
Date: Thu Jan 14 18:20:48 2010
New Revision: 899343
URL: http://svn.apache.org/viewvc?rev=899343&view=rev
Log:
Applied fix for DIRMINA-748
Modified:
mina/trunk/core/src/main/java/org/apache/mina/core/buffer/CachedBufferAllocator.java
Modified: mina/trunk/core/src/main/java/org/apache/mina/core/buffer/CachedBufferAllocator.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/core/buffer/CachedBufferAllocator.java?rev=899343&r1=899342&r2=899343&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/core/buffer/CachedBufferAllocator.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/core/buffer/CachedBufferAllocator.java Thu Jan 14 18:20:48 2010
@@ -90,6 +90,7 @@
if (maxPoolSize < 0) {
throw new IllegalArgumentException("maxPoolSize: " + maxPoolSize);
}
+
if (maxCachedBufferSize < 0) {
throw new IllegalArgumentException("maxCachedBufferSize: " + maxCachedBufferSize);
}
@@ -103,6 +104,7 @@
return newPoolMap();
}
};
+
this.directBuffers = new ThreadLocal<Map<Integer, Queue<CachedBuffer>>>() {
@Override
protected Map<Integer, Queue<CachedBuffer>> initialValue() {
@@ -132,18 +134,22 @@
Map<Integer, Queue<CachedBuffer>> poolMap =
new HashMap<Integer, Queue<CachedBuffer>>();
int poolSize = maxPoolSize == 0? DEFAULT_MAX_POOL_SIZE : maxPoolSize;
+
for (int i = 0; i < 31; i ++) {
poolMap.put(1 << i, new CircularQueue<CachedBuffer>(poolSize));
}
+
poolMap.put(0, new CircularQueue<CachedBuffer>(poolSize));
poolMap.put(Integer.MAX_VALUE, new CircularQueue<CachedBuffer>(poolSize));
+
return poolMap;
}
public IoBuffer allocate(int requestedCapacity, boolean direct) {
int actualCapacity = IoBuffer.normalizeCapacity(requestedCapacity);
IoBuffer buf ;
- if (maxCachedBufferSize != 0 && actualCapacity > maxCachedBufferSize) {
+
+ if ((maxCachedBufferSize != 0) && (actualCapacity > maxCachedBufferSize)) {
if (direct) {
buf = wrap(ByteBuffer.allocateDirect(actualCapacity));
} else {
@@ -151,6 +157,7 @@
}
} else {
Queue<CachedBuffer> pool;
+
if (direct) {
pool = directBuffers.get().get(actualCapacity);
} else {
@@ -159,6 +166,7 @@
// Recycle if possible.
buf = pool.poll();
+
if (buf != null) {
buf.clear();
buf.setAutoExpand(false);
@@ -257,14 +265,17 @@
}
private void free(ByteBuffer oldBuf) {
- if (oldBuf == null || oldBuf.capacity() > maxCachedBufferSize ||
- oldBuf.isReadOnly() || isDerived() ||
- Thread.currentThread() != ownerThread) {
+ if ((oldBuf == null) ||
+ ((maxCachedBufferSize != 0 ) && (oldBuf.capacity() > maxCachedBufferSize)) ||
+ oldBuf.isReadOnly() ||
+ isDerived() ||
+ (Thread.currentThread() != ownerThread)) {
return;
}
// Add to the cache.
Queue<CachedBuffer> pool;
+
if (oldBuf.isDirect()) {
pool = directBuffers.get().get(oldBuf.capacity());
} else {
@@ -276,7 +287,7 @@
}
// Restrict the size of the pool to prevent OOM.
- if (maxPoolSize == 0 || pool.size() < maxPoolSize) {
+ if ((maxPoolSize == 0) || (pool.size() < maxPoolSize)) {
pool.offer(new CachedBuffer(oldBuf));
}
}