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