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