aboutsummaryrefslogtreecommitdiff
path: root/nailgun_launcher/ClassLoaderCache.java
diff options
context:
space:
mode:
Diffstat (limited to 'nailgun_launcher/ClassLoaderCache.java')
-rw-r--r--nailgun_launcher/ClassLoaderCache.java66
1 files changed, 66 insertions, 0 deletions
diff --git a/nailgun_launcher/ClassLoaderCache.java b/nailgun_launcher/ClassLoaderCache.java
new file mode 100644
index 0000000..6bffad0
--- /dev/null
+++ b/nailgun_launcher/ClassLoaderCache.java
@@ -0,0 +1,66 @@
+package cbt;
+
+import java.util.*;
+import static java.io.File.pathSeparator;
+import static cbt.Stage0Lib.*;
+
+final public class ClassLoaderCache{
+ public Map<Object,Object> hashMap;
+ final ThreadLocal<HashSet<String>> seen = new ThreadLocal<HashSet<String>>(){
+ @Override protected HashSet<String> initialValue(){
+ return new HashSet<String>();
+ }
+ };
+
+ public ClassLoaderCache(
+ Map<Object,Object> hashMap
+ ){
+ this.hashMap = hashMap;
+ }
+
+ public ClassLoader get( String key, long timestamp ){
+ seen.get().add( key );
+ @SuppressWarnings("unchecked")
+ ClassLoader t = (ClassLoader) hashMap.get(
+ hashMap.get( key )
+ );
+ assert hashMap.get(t).equals(timestamp);
+ return t;
+ }
+
+ public boolean containsKey( String key, long timestamp ){
+ boolean contains = hashMap.containsKey( key );
+ if( contains ){
+ Object keyObject = hashMap.get( key );
+ Object classLoader = hashMap.get( keyObject );
+ long oldTimestamp = (long) hashMap.get( classLoader );
+ boolean res = oldTimestamp == timestamp;
+ return res;
+ } else {
+ return false;
+ }
+ }
+
+ public void put( String key, ClassLoader value, long timestamp ){
+ assert !seen.get().contains( key ): "Thread tries to update cache key after observing it: " + key;
+ LockableJavaKey keyObject = new LockableJavaKey();
+ hashMap.put( key, keyObject );
+ hashMap.put( keyObject, value );
+ hashMap.put( value, timestamp );
+ }
+
+ @Override public String toString(){
+ StringBuilder res = new StringBuilder();
+ res.append("ClassLoaderCache(\n\n");
+ for( Object key: hashMap.keySet() ){
+ if( key instanceof String )
+ res.append(
+ join( "\n", key.toString().split(":") ) + " -> " + hashMap.get( hashMap.get(key) )
+ + "\n\n"
+ );
+ }
+ res.append("\n\n");
+ return res.toString();
+ }
+}
+class LockableJavaKey{}