diff options
author | Rich Hickey <richhickey@gmail.com> | 2010-07-16 08:25:26 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-07-16 08:45:29 -0400 |
commit | da14cbb99fd5a3ccb4092fe629822a86065e6fb9 (patch) | |
tree | 4ff9d05868f60e840617259b19174b0eb1520c23 | |
parent | 85e99ee9c00e0f39cb8a960ba8e66d81e23ff49d (diff) |
factor out cache clearing to Util helper
-rw-r--r-- | src/jvm/clojure/lang/DynamicClassLoader.java | 12 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Util.java | 18 |
2 files changed, 19 insertions, 11 deletions
diff --git a/src/jvm/clojure/lang/DynamicClassLoader.java b/src/jvm/clojure/lang/DynamicClassLoader.java index fd2824ac..8719dc18 100644 --- a/src/jvm/clojure/lang/DynamicClassLoader.java +++ b/src/jvm/clojure/lang/DynamicClassLoader.java @@ -41,19 +41,9 @@ public DynamicClassLoader(ClassLoader parent){ } public Class defineClass(String name, byte[] bytes, Object srcForm){ + Util.clearCache(rq, classCache); Class c = defineClass(name, bytes, 0, bytes.length); classCache.put(name, new SoftReference(c,rq)); - //cleanup any dead entries - if(rq.poll() != null) - { - while(rq.poll() != null) - ; - for(Map.Entry<String,SoftReference<Class>> e : classCache.entrySet()) - { - if(e.getValue().get() == null) - classCache.remove(e.getKey(), e.getValue()); - } - } return c; } diff --git a/src/jvm/clojure/lang/Util.java b/src/jvm/clojure/lang/Util.java index 0070264c..8ef2c637 100644 --- a/src/jvm/clojure/lang/Util.java +++ b/src/jvm/clojure/lang/Util.java @@ -13,6 +13,11 @@ package clojure.lang; import java.math.BigInteger; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.lang.ref.SoftReference; +import java.lang.ref.ReferenceQueue; +import java.lang.ref.Reference; public class Util{ static public boolean equiv(Object k1, Object k2){ @@ -89,4 +94,17 @@ static public ISeq ret1(ISeq ret, Object nil){ return ret; } +static public <K,V> void clearCache(ReferenceQueue rq, ConcurrentHashMap<K, SoftReference<V>> cache){ + //cleanup any dead entries + if(rq.poll() != null) + { + while(rq.poll() != null) + ; + for(Map.Entry<K, SoftReference<V>> e : cache.entrySet()) + { + if(e.getValue().get() == null) + cache.remove(e.getKey(), e.getValue()); + } + } +} } |