Author: markt
Date: Tue Oct 18 17:06:05 2011
New Revision: 1185758
URL: http://svn.apache.org/viewvc?rev=1185758&view=rev
Log:
Fix possible small memory leak when investigating
https://issues.apache.org/bugzilla/show_bug.cgi?id=52042
Added:
tomcat/trunk/test/org/apache/jasper/util/
tomcat/trunk/test/org/apache/jasper/util/TestFastRemovalDequeue.java
Modified:
tomcat/trunk/java/org/apache/jasper/util/FastRemovalDequeue.java
Modified: tomcat/trunk/java/org/apache/jasper/util/FastRemovalDequeue.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/util/FastRemovalDequeue.java?rev=1185758&r1=1185757&r2=1185758&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/util/FastRemovalDequeue.java (original)
+++ tomcat/trunk/java/org/apache/jasper/util/FastRemovalDequeue.java Tue Oct 18
17:06:05 2011
@@ -50,9 +50,9 @@ public class FastRemovalDequeue<T> {
/** Maximum size of the queue */
private final int maxSize;
/** First element of the queue. */
- private Entry first;
+ protected Entry first;
/** Last element of the queue. */
- private Entry last;
+ protected Entry last;
/** Size of the queue */
private int size;
@@ -137,7 +137,9 @@ public class FastRemovalDequeue<T> {
Entry element = first;
first = first.getNext();
content = element.getContent();
- if (first != null) {
+ if (first == null) {
+ last =null;
+ } else {
first.setPrevious(null);
}
size--;
@@ -157,7 +159,9 @@ public class FastRemovalDequeue<T> {
Entry element = last;
last = last.getPrevious();
content = element.getContent();
- if (last != null) {
+ if (last == null) {
+ first = null;
+ } else {
last.setNext(null);
}
size--;
Added: tomcat/trunk/test/org/apache/jasper/util/TestFastRemovalDequeue.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/jasper/util/TestFastRemovalDequeue.java?rev=1185758&view=auto
==============================================================================
--- tomcat/trunk/test/org/apache/jasper/util/TestFastRemovalDequeue.java (added)
+++ tomcat/trunk/test/org/apache/jasper/util/TestFastRemovalDequeue.java Tue
Oct 18 17:06:05 2011
@@ -0,0 +1,199 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jasper.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+
+
+public class TestFastRemovalDequeue {
+
+ @Test
+ public void testSinglePushPop() throws Exception {
+ FastRemovalDequeue<Object> q = new FastRemovalDequeue<Object>(2);
+
+ Object o1 = new Object();
+
+ q.push(o1);
+
+ Object r = q.pop();
+
+ assertEquals(o1, r);
+ assertNull(q.first);
+ assertNull(q.last);
+ }
+
+
+ @Test
+ public void testDoublePushPop() throws Exception {
+ FastRemovalDequeue<Object> q = new FastRemovalDequeue<Object>(2);
+
+ Object o1 = new Object();
+ Object o2 = new Object();
+
+ q.push(o1);
+ q.push(o2);
+
+ assertEquals(o2, q.first.getContent());
+ assertEquals(o1, q.last.getContent());
+
+ Object r1 = q.pop();
+
+ assertEquals(o1, r1);
+ assertEquals(o2, q.first.getContent());
+ assertEquals(o2, q.last.getContent());
+
+
+ Object r2 = q.pop();
+ assertEquals(o2, r2);
+ assertNull(q.first);
+ assertNull(q.last);
+ }
+
+
+ @Test
+ public void testSingleUnpopPop() throws Exception {
+ FastRemovalDequeue<Object> q = new FastRemovalDequeue<Object>(2);
+
+ Object o1 = new Object();
+
+ q.unpop(o1);
+
+ Object r = q.pop();
+
+ assertEquals(o1, r);
+ assertNull(q.first);
+ assertNull(q.last);
+ }
+
+
+ @Test
+ public void testDoubleUnpopPop() throws Exception {
+ FastRemovalDequeue<Object> q = new FastRemovalDequeue<Object>(2);
+
+ Object o1 = new Object();
+ Object o2 = new Object();
+
+ q.unpop(o1);
+ q.unpop(o2);
+
+ assertEquals(o1, q.first.getContent());
+ assertEquals(o2, q.last.getContent());
+
+ Object r2 = q.pop();
+
+ assertEquals(o2, r2);
+ assertEquals(o1, q.first.getContent());
+ assertEquals(o1, q.last.getContent());
+
+
+ Object r1 = q.pop();
+ assertEquals(o1, r1);
+ assertNull(q.first);
+ assertNull(q.last);
+ }
+
+
+ @Test
+ public void testSinglePushUnpush() throws Exception {
+ FastRemovalDequeue<Object> q = new FastRemovalDequeue<Object>(2);
+
+ Object o1 = new Object();
+
+ q.push(o1);
+
+ Object r = q.unpush();
+
+ assertEquals(o1, r);
+ assertNull(q.first);
+ assertNull(q.last);
+ }
+
+
+ @Test
+ public void testDoublePushUnpush() throws Exception {
+ FastRemovalDequeue<Object> q = new FastRemovalDequeue<Object>(2);
+
+ Object o1 = new Object();
+ Object o2 = new Object();
+
+ q.push(o1);
+ q.push(o2);
+
+ assertEquals(o2, q.first.getContent());
+ assertEquals(o1, q.last.getContent());
+
+ Object r2 = q.unpush();
+
+ assertEquals(o2, r2);
+ assertEquals(o1, q.first.getContent());
+ assertEquals(o1, q.last.getContent());
+
+
+ Object r1 = q.unpush();
+ assertEquals(o1, r1);
+ assertNull(q.first);
+ assertNull(q.last);
+ }
+
+
+ @Test
+ public void testSinglePushRemove() throws Exception {
+ FastRemovalDequeue<Object> q = new FastRemovalDequeue<Object>(2);
+
+ Object o1 = new Object();
+
+ FastRemovalDequeue<Object>.Entry e1 = q.push(o1);
+
+ assertEquals(o1, e1.getContent());
+
+ q.remove(e1);
+
+ assertNull(q.first);
+ assertNull(q.last);
+ }
+
+
+ @Test
+ public void testDoublePushRemove() throws Exception {
+ FastRemovalDequeue<Object> q = new FastRemovalDequeue<Object>(2);
+
+ Object o1 = new Object();
+ Object o2 = new Object();
+
+ FastRemovalDequeue<Object>.Entry e1 = q.push(o1);
+ FastRemovalDequeue<Object>.Entry e2 = q.push(o2);
+
+ assertEquals(o1, e1.getContent());
+ assertEquals(o2, e2.getContent());
+
+ assertEquals(o2, q.first.getContent());
+ assertEquals(o1, q.last.getContent());
+
+ q.remove(e1);
+
+ assertEquals(o2, q.first.getContent());
+ assertEquals(o2, q.last.getContent());
+
+ q.remove(e2);
+
+ assertNull(q.first);
+ assertNull(q.last);
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]