summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2010-07-16 08:25:26 -0400
committerRich Hickey <richhickey@gmail.com>2010-07-16 08:45:29 -0400
commitda14cbb99fd5a3ccb4092fe629822a86065e6fb9 (patch)
tree4ff9d05868f60e840617259b19174b0eb1520c23
parent85e99ee9c00e0f39cb8a960ba8e66d81e23ff49d (diff)
factor out cache clearing to Util helper
-rw-r--r--src/jvm/clojure/lang/DynamicClassLoader.java12
-rw-r--r--src/jvm/clojure/lang/Util.java18
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());
+ }
+ }
+}
}