ASF Bugzilla – Attachment 20912 Details for
Bug 43544
LRUCache implementation not updated to match latest collections code
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch to bring LRU cacheing for EL tags in line with latest Collections code.
43544.diff (text/plain), 12.81 KB, created by
Bjorn Townsend
on 2007-10-03 15:14:51 UTC
(
hide
)
Description:
Patch to bring LRU cacheing for EL tags in line with latest Collections code.
Filename:
MIME Type:
Creator:
Bjorn Townsend
Created:
2007-10-03 15:14:51 UTC
Size:
12.81 KB
patch
obsolete
>Index: src/org/apache/taglibs/standard/extra/collections/iterators/EmptyMapIterator.java >=================================================================== >--- src/org/apache/taglibs/standard/extra/collections/iterators/EmptyMapIterator.java (revision 581727) >+++ src/org/apache/taglibs/standard/extra/collections/iterators/EmptyMapIterator.java (working copy) >@@ -22,7 +22,7 @@ > * Provides an implementation of an empty map iterator. > * > * @since Commons Collections 3.1 >- * @version $Revision: 218351 $ $Date: 2004-10-20 17:58:23 -0700 (Wed, 20 Oct 2004) $ >+ * @version $Revision: 155406 $ $Date: 2005-02-26 12:55:26 +0000 (Sat, 26 Feb 2005) $ > * > * @author Stephen Colebourne > */ >Index: src/org/apache/taglibs/standard/extra/collections/iterators/EmptyIterator.java >=================================================================== >--- src/org/apache/taglibs/standard/extra/collections/iterators/EmptyIterator.java (revision 581727) >+++ src/org/apache/taglibs/standard/extra/collections/iterators/EmptyIterator.java (working copy) >@@ -27,7 +27,7 @@ > * 2.1.1 and 3.1 due to issues with <code>IteratorUtils</code>. > * > * @since Commons Collections 2.1.1 and 3.1 >- * @version $Revision: 218351 $ $Date: 2004-10-20 17:58:23 -0700 (Wed, 20 Oct 2004) $ >+ * @version $Revision: 155406 $ $Date: 2005-02-26 12:55:26 +0000 (Sat, 26 Feb 2005) $ > * > * @author Stephen Colebourne > */ >Index: src/org/apache/taglibs/standard/extra/collections/iterators/EmptyOrderedMapIterator.java >=================================================================== >--- src/org/apache/taglibs/standard/extra/collections/iterators/EmptyOrderedMapIterator.java (revision 581727) >+++ src/org/apache/taglibs/standard/extra/collections/iterators/EmptyOrderedMapIterator.java (working copy) >@@ -22,7 +22,7 @@ > * Provides an implementation of an empty ordered map iterator. > * > * @since Commons Collections 3.1 >- * @version $Revision: 218351 $ $Date: 2004-10-20 17:58:23 -0700 (Wed, 20 Oct 2004) $ >+ * @version $Revision: 155406 $ $Date: 2005-02-26 12:55:26 +0000 (Sat, 26 Feb 2005) $ > * > * @author Stephen Colebourne > */ >Index: src/org/apache/taglibs/standard/extra/collections/iterators/AbstractEmptyIterator.java >=================================================================== >--- src/org/apache/taglibs/standard/extra/collections/iterators/AbstractEmptyIterator.java (revision 581727) >+++ src/org/apache/taglibs/standard/extra/collections/iterators/AbstractEmptyIterator.java (working copy) >@@ -21,7 +21,7 @@ > * Provides an implementation of an empty iterator. > * > * @since Commons Collections 3.1 >- * @version $Revision: 218351 $ $Date: 2004-10-20 17:58:23 -0700 (Wed, 20 Oct 2004) $ >+ * @version $Revision: 155406 $ $Date: 2005-02-26 12:55:26 +0000 (Sat, 26 Feb 2005) $ > * > * @author Stephen Colebourne > */ >Index: src/org/apache/taglibs/standard/extra/collections/iterators/EmptyOrderedIterator.java >=================================================================== >--- src/org/apache/taglibs/standard/extra/collections/iterators/EmptyOrderedIterator.java (revision 581727) >+++ src/org/apache/taglibs/standard/extra/collections/iterators/EmptyOrderedIterator.java (working copy) >@@ -22,7 +22,7 @@ > * Provides an implementation of an empty ordered iterator. > * > * @since Commons Collections 3.1 >- * @version $Revision: 218351 $ $Date: 2004-10-20 17:58:23 -0700 (Wed, 20 Oct 2004) $ >+ * @version $Revision: 155406 $ $Date: 2005-02-26 12:55:26 +0000 (Sat, 26 Feb 2005) $ > * > * @author Stephen Colebourne > */ >Index: src/org/apache/taglibs/standard/extra/collections/map/LRUMap.java >=================================================================== >--- src/org/apache/taglibs/standard/extra/collections/map/LRUMap.java (revision 581727) >+++ src/org/apache/taglibs/standard/extra/collections/map/LRUMap.java (working copy) >@@ -1,5 +1,5 @@ > /* >- * Copyright 2001-2004 The Apache Software Foundation >+ * Copyright 2001-2005 The Apache Software Foundation > * > * Licensed under the Apache License, Version 2.0 (the "License"); > * you may not use this file except in compliance with the License. >@@ -39,9 +39,15 @@ > * <p> > * All the available iterators can be reset back to the start by casting to > * <code>ResettableIterator</code> and calling <code>reset()</code>. >- * >+ * <p> >+ * <strong>Note that LRUMap is not synchronized and is not thread-safe.</strong> >+ * If you wish to use this map from multiple threads concurrently, you must use >+ * appropriate synchronization. The simplest approach is to wrap this map >+ * using {@link java.util.Collections#synchronizedMap(Map)}. This class may throw >+ * <code>NullPointerException</code>'s when accessed by concurrent threads. >+ * > * @since Commons Collections 3.0 (previously in main package v1.0) >- * @version $Revision: 218351 $ $Date: 2004-10-20 17:58:23 -0700 (Wed, 20 Oct 2004) $ >+ * @version $Revision: 348299 $ $Date: 2005-11-22 23:51:45 +0000 (Tue, 22 Nov 2005) $ > * > * @author James Strachan > * @author Morgan Delagrange >@@ -53,7 +59,7 @@ > extends AbstractLinkedMap implements BoundedMap, Serializable, Cloneable { > > /** Serialisation version */ >- static final long serialVersionUID = -612114643488955218L; >+ private static final long serialVersionUID = -612114643488955218L; > /** Default maximum size */ > protected static final int DEFAULT_MAX_SIZE = 100; > >@@ -191,6 +197,9 @@ > entry.before = header.before; > header.before.after = entry; > header.before = entry; >+ } else if (entry == header) { >+ throw new IllegalStateException("Can't move header to MRU" + >+ " (please report this to commons-dev@jakarta.apache.org)"); > } > } > >@@ -228,18 +237,32 @@ > LinkEntry reuse = header.after; > boolean removeLRUEntry = false; > if (scanUntilRemovable) { >- while (reuse != header) { >+ while (reuse != header && reuse != null) { > if (removeLRU(reuse)) { > removeLRUEntry = true; > break; > } > reuse = reuse.after; > } >+ if (reuse == null) { >+ throw new IllegalStateException( >+ "Entry.after=null, header.after" + header.after + " header.before" + header.before + >+ " key=" + key + " value=" + value + " size=" + size + " maxSize=" + maxSize + >+ " Please check that your keys are immutable, and that you have used synchronization properly." + >+ " If so, then please report this to commons-dev@jakarta.apache.org as a bug."); >+ } > } else { > removeLRUEntry = removeLRU(reuse); > } > > if (removeLRUEntry) { >+ if (reuse == null) { >+ throw new IllegalStateException( >+ "reuse=null, header.after=" + header.after + " header.before" + header.before + >+ " key=" + key + " value=" + value + " size=" + size + " maxSize=" + maxSize + >+ " Please check that your keys are immutable, and that you have used synchronization properly." + >+ " If so, then please report this to commons-dev@jakarta.apache.org as a bug."); >+ } > reuseMapping(reuse, hashIndex, hashCode, key, value); > } else { > super.addMapping(hashIndex, hashCode, key, value); >@@ -264,19 +287,35 @@ > // find the entry before the entry specified in the hash table > // remember that the parameters (except the first) refer to the new entry, > // not the old one >- int removeIndex = hashIndex(entry.hashCode, data.length); >- HashEntry loop = data[removeIndex]; >- HashEntry previous = null; >- while (loop != entry) { >- previous = loop; >- loop = loop.next; >+ try { >+ int removeIndex = hashIndex(entry.hashCode, data.length); >+ HashEntry[] tmp = data; // may protect against some sync issues >+ HashEntry loop = tmp[removeIndex]; >+ HashEntry previous = null; >+ while (loop != entry && loop != null) { >+ previous = loop; >+ loop = loop.next; >+ } >+ if (loop == null) { >+ throw new IllegalStateException( >+ "Entry.next=null, data[removeIndex]=" + data[removeIndex] + " previous=" + previous + >+ " key=" + key + " value=" + value + " size=" + size + " maxSize=" + maxSize + >+ " Please check that your keys are immutable, and that you have used synchronization properly." + >+ " If so, then please report this to commons-dev@jakarta.apache.org as a bug."); >+ } >+ >+ // reuse the entry >+ modCount++; >+ removeEntry(entry, removeIndex, previous); >+ reuseEntry(entry, hashIndex, hashCode, key, value); >+ addEntry(entry, hashIndex); >+ } catch (NullPointerException ex) { >+ throw new IllegalStateException( >+ "NPE, entry=" + entry + " entryIsHeader=" + (entry==header) + >+ " key=" + key + " value=" + value + " size=" + size + " maxSize=" + maxSize + >+ " Please check that your keys are immutable, and that you have used synchronization properly." + >+ " If so, then please report this to commons-dev@jakarta.apache.org as a bug."); > } >- >- // reuse the entry >- modCount++; >- removeEntry(entry, removeIndex, previous); >- reuseEntry(entry, hashIndex, hashCode, key, value); >- addEntry(entry, hashIndex); > } > > /** >Index: src/org/apache/taglibs/standard/extra/collections/map/AbstractLinkedMap.java >=================================================================== >--- src/org/apache/taglibs/standard/extra/collections/map/AbstractLinkedMap.java (revision 581727) >+++ src/org/apache/taglibs/standard/extra/collections/map/AbstractLinkedMap.java (working copy) >@@ -57,7 +57,7 @@ > * methods exposed. > * > * @since Commons Collections 3.0 >- * @version $Revision: 218351 $ $Date: 2004-10-20 17:58:23 -0700 (Wed, 20 Oct 2004) $ >+ * @version $Revision: 158688 $ $Date: 2005-03-22 22:14:15 +0000 (Tue, 22 Mar 2005) $ > * > * @author java util LinkedHashMap > * @author Stephen Colebourne >@@ -120,9 +120,13 @@ > > /** > * Initialise this subclass during construction. >+ * <p> >+ * NOTE: As from v3.2 this method calls >+ * {@link #createEntry(HashEntry, int, Object, Object)} to create >+ * the map entry object. > */ > protected void init() { >- header = new LinkEntry(null, -1, null, null); >+ header = (LinkEntry) createEntry(null, -1, null, null); > header.before = header.after = header; > } > >Index: src/org/apache/taglibs/standard/extra/collections/map/AbstractHashedMap.java >=================================================================== >--- src/org/apache/taglibs/standard/extra/collections/map/AbstractHashedMap.java (revision 581727) >+++ src/org/apache/taglibs/standard/extra/collections/map/AbstractHashedMap.java (working copy) >@@ -1,5 +1,5 @@ > /* >- * Copyright 2003-2004 The Apache Software Foundation >+ * Copyright 2003-2005 The Apache Software Foundation > * > * Licensed under the Apache License, Version 2.0 (the "License"); > * you may not use this file except in compliance with the License. >@@ -52,10 +52,11 @@ > * This extends clause will be removed in v4.0. > * > * @since Commons Collections 3.0 >- * @version $Revision: 218351 $ $Date: 2004-10-20 17:58:23 -0700 (Wed, 20 Oct 2004) $ >+ * @version $Revision: 171349 $ $Date: 2005-05-22 18:48:56 +0100 (Sun, 22 May 2005) $ > * > * @author java util HashMap > * @author Stephen Colebourne >+ * @author Christian Siefkes > */ > public class AbstractHashedMap extends AbstractMap implements IterableMap { > >@@ -145,8 +146,8 @@ > throw new IllegalArgumentException("Load factor must be greater than 0"); > } > this.loadFactor = loadFactor; >+ initialCapacity = calculateNewCapacity(initialCapacity); > this.threshold = calculateThreshold(initialCapacity, loadFactor); >- initialCapacity = calculateNewCapacity(initialCapacity); > this.data = new HashEntry[initialCapacity]; > init(); > } >@@ -1204,13 +1205,13 @@ > int capacity = in.readInt(); > int size = in.readInt(); > init(); >+ threshold = calculateThreshold(capacity, loadFactor); > data = new HashEntry[capacity]; > for (int i = 0; i < size; i++) { > Object key = in.readObject(); > Object value = in.readObject(); > put(key, value); > } >- threshold = calculateThreshold(data.length, loadFactor); > } > > //-----------------------------------------------------------------------
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 43544
: 20912