diff options
author | Rich Hickey <richhickey@gmail.com> | 2011-03-03 08:46:31 -0500 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2011-03-03 08:46:31 -0500 |
commit | 5ee542d3de7e22d68e923c0f9c63267960cd1647 (patch) | |
tree | a57b11123a5657eeec31953e509bdac5990859f7 | |
parent | 1aeb592afc0059c8d66a635699c460f70b81a102 (diff) |
switch keyword map to weak refs
-rw-r--r-- | src/jvm/clojure/lang/DynamicClassLoader.java | 7 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Keyword.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Util.java | 5 |
3 files changed, 12 insertions, 8 deletions
diff --git a/src/jvm/clojure/lang/DynamicClassLoader.java b/src/jvm/clojure/lang/DynamicClassLoader.java index e85071a0..17fa5a10 100644 --- a/src/jvm/clojure/lang/DynamicClassLoader.java +++ b/src/jvm/clojure/lang/DynamicClassLoader.java @@ -12,6 +12,7 @@ package clojure.lang; +import java.lang.ref.Reference; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -22,8 +23,8 @@ import java.lang.ref.SoftReference; public class DynamicClassLoader extends URLClassLoader{ HashMap<Integer, Object[]> constantVals = new HashMap<Integer, Object[]>(); -static ConcurrentHashMap<String, SoftReference<Class>>classCache = - new ConcurrentHashMap<String, SoftReference<Class> >(); +static ConcurrentHashMap<String, Reference<Class>>classCache = + new ConcurrentHashMap<String, Reference<Class> >(); static final URL[] EMPTY_URLS = new URL[]{}; @@ -48,7 +49,7 @@ public Class defineClass(String name, byte[] bytes, Object srcForm){ } protected Class<?> findClass(String name) throws ClassNotFoundException{ - SoftReference<Class> cr = classCache.get(name); + Reference<Class> cr = classCache.get(name); if(cr != null) { Class c = cr.get(); diff --git a/src/jvm/clojure/lang/Keyword.java b/src/jvm/clojure/lang/Keyword.java index 4ed8bc1a..377ee67c 100644 --- a/src/jvm/clojure/lang/Keyword.java +++ b/src/jvm/clojure/lang/Keyword.java @@ -14,6 +14,8 @@ package clojure.lang; import java.io.ObjectStreamException; import java.io.Serializable; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; import java.util.concurrent.ConcurrentHashMap; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; @@ -21,7 +23,7 @@ import java.lang.ref.SoftReference; public final class Keyword implements IFn, Comparable, Named, Serializable { -private static ConcurrentHashMap<Symbol, SoftReference<Keyword>> table = new ConcurrentHashMap(); +private static ConcurrentHashMap<Symbol, Reference<Keyword>> table = new ConcurrentHashMap(); static final ReferenceQueue rq = new ReferenceQueue(); public final Symbol sym; final int hash; @@ -31,7 +33,7 @@ public static Keyword intern(Symbol sym){ sym = (Symbol) sym.withMeta(null); Util.clearCache(rq, table); Keyword k = new Keyword(sym); - SoftReference<Keyword> existingRef = table.putIfAbsent(sym, new SoftReference<Keyword>(k,rq)); + Reference<Keyword> existingRef = table.putIfAbsent(sym, new WeakReference<Keyword>(k,rq)); if(existingRef == null) return k; Keyword existingk = existingRef.get(); @@ -56,7 +58,7 @@ private Keyword(Symbol sym){ } public static Keyword find(Symbol sym){ - SoftReference<Keyword> ref = table.get(sym); + Reference<Keyword> ref = table.get(sym); if (ref != null) return ref.get(); else diff --git a/src/jvm/clojure/lang/Util.java b/src/jvm/clojure/lang/Util.java index 5b5ee4ec..c2a37f75 100644 --- a/src/jvm/clojure/lang/Util.java +++ b/src/jvm/clojure/lang/Util.java @@ -12,6 +12,7 @@ package clojure.lang; +import java.lang.ref.Reference; import java.math.BigInteger; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -124,13 +125,13 @@ static public ISeq ret1(ISeq ret, Object nil){ return ret; } -static public <K,V> void clearCache(ReferenceQueue rq, ConcurrentHashMap<K, SoftReference<V>> cache){ +static public <K,V> void clearCache(ReferenceQueue rq, ConcurrentHashMap<K, Reference<V>> cache){ //cleanup any dead entries if(rq.poll() != null) { while(rq.poll() != null) ; - for(Map.Entry<K, SoftReference<V>> e : cache.entrySet()) + for(Map.Entry<K, Reference<V>> e : cache.entrySet()) { if(e.getValue().get() == null) cache.remove(e.getKey(), e.getValue()); |