diff --git a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorRepository.java b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorRepository.java index 33296733c..3bf80cebf 100644 --- a/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorRepository.java +++ b/com.ibm.wala.util/src/com/ibm/wala/util/intset/BitVectorRepository.java @@ -10,12 +10,12 @@ *******************************************************************************/ package com.ibm.wala.util.intset; +import java.lang.ref.WeakReference; import java.util.Iterator; +import java.util.LinkedList; import java.util.Map; -import java.util.WeakHashMap; import com.ibm.wala.util.collections.HashMapFactory; -import com.ibm.wala.util.collections.MapUtil; /** * A repository for shared bit vectors as described by Heintze @@ -35,7 +35,7 @@ public class BitVectorRepository { /** * A Mapping from Integer -> WeakHashMap */ - final private static Map> buckets = HashMapFactory.make(); + final private static Map>> buckets = HashMapFactory.make(); /** * @param value @@ -56,24 +56,35 @@ public class BitVectorRepository { } int size = value.size(); for (int i = size; i > size - SUBSET_DELTA; i--) { - WeakHashMap m = buckets.get(Integer.valueOf(i)); + LinkedList> m = buckets.get(Integer.valueOf(i)); if (m != null) { - for (Iterator it = m.keySet().iterator(); it.hasNext();) { - BitVectorIntSet bv = (BitVectorIntSet) it.next(); - if (bv.isSubset(value)) { - // FOUND ONE! - if (STATS) { - hits++; + Iterator> it = m.iterator(); + while (it.hasNext()) { + WeakReference wr = it.next(); + BitVectorIntSet bv = wr.get(); + if (bv != null) { + if (bv.isSubset(value)) { + // FOUND ONE! + if (STATS) { + hits++; + } + return bv; } - return bv; + } else { + // might as well clear out the weak ref + it.remove(); } } } } // didn't find one. create one. - WeakHashMap m = MapUtil.findOrCreateWeakHashMap(buckets, new Integer(size)); + LinkedList> m = buckets.get(size); + if (m == null) { + m = new LinkedList>(); + buckets.put(size, m); + } BitVectorIntSet bv = new BitVectorIntSet(value); - m.put(bv, null); + m.add(new WeakReference(bv)); return bv; } @@ -90,9 +101,9 @@ public class BitVectorRepository { */ private static int countEntries() { int result = 0; - for (Iterator> it = buckets.values().iterator(); it.hasNext();) { - WeakHashMap m = it.next(); - result += m.size(); + for (LinkedList> l : buckets.values()) { + // don't worry about cleared WeakReferences; count will be rough + result += l.size(); } return result; }