Author: trustin
Date: Sun Mar  9 23:34:13 2008
New Revision: 635452

URL: http://svn.apache.org/viewvc?rev=635452&view=rev
Log:
Fixed DIRMINA-542 (ArrayIndexOutOfBoundsException in 
CircularQueue.shrinkIfNeeded())
* Added related test case
* Made sure shrinkIfNeeded doesn't copy anything if empty

Modified:
    mina/trunk/core/src/main/java/org/apache/mina/util/CircularQueue.java
    mina/trunk/core/src/test/java/org/apache/mina/util/CircularQueueTest.java

Modified: mina/trunk/core/src/main/java/org/apache/mina/util/CircularQueue.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/util/CircularQueue.java?rev=635452&r1=635451&r2=635452&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/util/CircularQueue.java 
(original)
+++ mina/trunk/core/src/main/java/org/apache/mina/util/CircularQueue.java Sun 
Mar  9 23:34:13 2008
@@ -205,7 +205,7 @@
     
     private void shrinkIfNeeded() {
         int size = size();
-        if (size < shrinkThreshold) {
+        if (size <= shrinkThreshold) {
             // shrink queue
             final int oldLen = items.length;
             int newLen = normalizeCapacity(size);
@@ -227,11 +227,14 @@
             
             Object[] tmp = new Object[newLen];
     
-            if (first < last) {
-                System.arraycopy(items, first, tmp, 0, last - first);
-            } else {
-                System.arraycopy(items, first, tmp, 0, oldLen - first);
-                System.arraycopy(items, 0, tmp, oldLen - first, last);
+            // Copy only when there's something to copy.
+            if (size > 0) {
+                if (first < last) {
+                    System.arraycopy(items, first, tmp, 0, last - first);
+                } else {
+                    System.arraycopy(items, first, tmp, 0, oldLen - first);
+                    System.arraycopy(items, 0, tmp, oldLen - first, last);
+                }
             }
     
             first = 0;

Modified: 
mina/trunk/core/src/test/java/org/apache/mina/util/CircularQueueTest.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/util/CircularQueueTest.java?rev=635452&r1=635451&r2=635452&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/util/CircularQueueTest.java 
(original)
+++ mina/trunk/core/src/test/java/org/apache/mina/util/CircularQueueTest.java 
Sun Mar  9 23:34:13 2008
@@ -178,6 +178,22 @@
             // OK
         }
     }
+    
+    public void testExpandAndShrink() throws Exception {
+        CircularQueue<Integer> q = new CircularQueue<Integer>();
+        for (int i = 0; i < 1024; i ++) {
+            q.offer(i);
+        }
+        
+        for (int i = 0; i < 512; i ++) {
+            q.poll();
+            q.offer(i);
+        }
+        
+        for (int i = 0; i < 1024; i ++) { 
+            q.poll();
+        }
+    }
 
     private CircularQueue<Integer> getRotatedQueue() {
         CircularQueue<Integer> q = new CircularQueue<Integer>();


Reply via email to