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));
             }
         }