Author: trustin
Date: Sun Nov 11 06:25:28 2007
New Revision: 593885

URL: http://svn.apache.org/viewvc?rev=593885&view=rev
Log:
* Optimization for the zero-sized buffers
* AbstractIoBuffer.compact() calculates the new capacity more precisely.

Modified:
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoBuffer.java
    mina/trunk/core/src/main/java/org/apache/mina/common/IoBuffer.java

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoBuffer.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoBuffer.java?rev=593885&r1=593884&r2=593885&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoBuffer.java 
(original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoBuffer.java 
Sun Nov 11 06:25:28 2007
@@ -302,8 +302,21 @@
     @Override
     public IoBuffer compact() {
         int remaining = remaining();
-        if (isAutoShrink() && remaining <= capacity() >>> 2) {
-            int newCapacity = remaining << 1;
+        int capacity = capacity();
+        if (capacity == 0) {
+            return this;
+        }
+
+        if (isAutoShrink() && remaining <= capacity >>> 2) {
+            int newCapacity = capacity;
+            int minCapacity = Math.max(initialCapacity, remaining << 1);
+            for (;;) {
+                if (newCapacity >>> 1 < minCapacity) {
+                    break;
+                }
+                newCapacity >>>= 1;
+            }
+            
             if (newCapacity < initialCapacity && initialCapacity == 
capacity()) {
                 buf().compact();
             } else {

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/IoBuffer.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/IoBuffer.java?rev=593885&r1=593884&r2=593885&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/IoBuffer.java 
(original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/IoBuffer.java Sun Nov 
11 06:25:28 2007
@@ -148,7 +148,8 @@
  */
 public abstract class IoBuffer implements Comparable<IoBuffer> {
     private static IoBufferAllocator allocator = new SimpleBufferAllocator();
-
+    private static final IoBuffer EMPTY_DIRECT_BUFFER = allocator.allocate(0, 
true);
+    private static final IoBuffer EMPTY_HEAP_BUFFER = allocator.allocate(0, 
false);
     private static boolean useDirectBuffer = false;
 
     /**
@@ -218,6 +219,14 @@
      *                 <tt>false</tt> to get a heap buffer.
      */
     public static IoBuffer allocate(int capacity, boolean direct) {
+        if (capacity == 0) {
+            return direct? EMPTY_DIRECT_BUFFER : EMPTY_HEAP_BUFFER;
+        }
+        
+        if (capacity < 0) {
+            throw new IllegalArgumentException("capacity: " + capacity);
+        }
+
         return allocator.allocate(capacity, direct);
     }
 


Reply via email to