aboutsummaryrefslogtreecommitdiff
path: root/nailgun_launcher/NailgunLauncher.java
diff options
context:
space:
mode:
authorChristopher Vogt <oss.nsp@cvogt.org>2016-03-15 02:44:20 -0400
committerChristopher Vogt <oss.nsp@cvogt.org>2016-03-19 21:13:49 -0400
commit27ff278767edf5972782ec7568c1da7fb3019ed6 (patch)
tree345247dba9994aa572ebb0cffee7a9ed580a7090 /nailgun_launcher/NailgunLauncher.java
parent1da86970a6f6a801fa42c1cc4e0468bbb74e4ef4 (diff)
downloadcbt-27ff278767edf5972782ec7568c1da7fb3019ed6.tar.gz
cbt-27ff278767edf5972782ec7568c1da7fb3019ed6.tar.bz2
cbt-27ff278767edf5972782ec7568c1da7fb3019ed6.zip
More speedup by already caching some classloaders in NailgunLauncher. Also fix a few warnings.
Diffstat (limited to 'nailgun_launcher/NailgunLauncher.java')
-rw-r--r--nailgun_launcher/NailgunLauncher.java84
1 files changed, 59 insertions, 25 deletions
diff --git a/nailgun_launcher/NailgunLauncher.java b/nailgun_launcher/NailgunLauncher.java
index a0b6361..d14e968 100644
--- a/nailgun_launcher/NailgunLauncher.java
+++ b/nailgun_launcher/NailgunLauncher.java
@@ -21,8 +21,8 @@ public class NailgunLauncher{
* Persistent cache for caching classloaders for the JVM life time. Can be used as needed by user
* code to improve startup time.
*/
- public static ConcurrentHashMap classLoaderCacheKeys = new ConcurrentHashMap();
- public static ConcurrentHashMap classLoaderCacheValues = new ConcurrentHashMap();
+ public static ConcurrentHashMap<String, Object> classLoaderCacheKeys = new ConcurrentHashMap<String,Object>();
+ public static ConcurrentHashMap<Object, ClassLoader> classLoaderCacheValues = new ConcurrentHashMap<Object,ClassLoader>();
public static SecurityManager defaultSecurityManager = System.getSecurityManager();
@@ -31,29 +31,63 @@ public class NailgunLauncher{
IllegalAccessException,
InvocationTargetException,
MalformedURLException {
- if (args.length < 3) {
- System.out.println("usage: <main class> <class path> <... args>");
- } else {
- // TODO: cache this classloader, but invalidate on changes
- String[] cp = args[1].split(File.pathSeparator);
-
- URL[] urls = new URL[cp.length];
- for(int i = 0; i < cp.length; i++){
- urls[i] = new URL("file:"+cp[i]);
- }
-
- String[] newArgs = new String[args.length-2];
- for(int i = 0; i < args.length-2; i++){
- newArgs[i] = args[i+2];
- }
-
- new URLClassLoader( urls ){
- public String toString(){
- return super.toString() + "(\n " + Arrays.toString(urls) + "\n)";
- }
- }.loadClass(args[0])
- .getMethod("main", String[].class)
- .invoke( null/* _cls.newInstance()*/, (Object) newArgs );
+ String CBT_HOME = System.getenv("CBT_HOME");
+ String SCALA_VERSION = System.getenv("SCALA_VERSION");
+ String NAILGUN = System.getenv("NAILGUN");
+ String STAGE1 = System.getenv("STAGE1");
+ String TARGET = System.getenv("TARGET");
+ assert(CBT_HOME != null);
+ assert(SCALA_VERSION != null);
+ assert(NAILGUN != null);
+ assert(STAGE1 != null);
+ assert(TARGET != null);
+
+ String library = CBT_HOME+"/bootstrap_scala/cache/"+SCALA_VERSION+"/scala-library-"+SCALA_VERSION+".jar";
+ if(!classLoaderCacheKeys.containsKey(library)){
+ Object libraryKey = new Object();
+ classLoaderCacheKeys.put(library,libraryKey);
+ ClassLoader libraryClassLoader = new URLClassLoader( new URL[]{ new URL("file:"+library) } );
+ classLoaderCacheValues.put(libraryKey, libraryClassLoader);
+
+ String xml = CBT_HOME+"/bootstrap_scala/cache/"+SCALA_VERSION+"/scala-xml_2.11-1.0.5.jar";
+ Object xmlKey = new Object();
+ classLoaderCacheKeys.put(xml,xmlKey);
+ ClassLoader xmlClassLoader = new URLClassLoader(
+ new URL[]{ new URL("file:"+xml) },
+ libraryClassLoader
+ );
+ classLoaderCacheValues.put(xmlKey, xmlClassLoader);
+
+ Object nailgunKey = new Object();
+ classLoaderCacheKeys.put(NAILGUN+TARGET,nailgunKey);
+ ClassLoader nailgunClassLoader = new URLClassLoader(
+ new URL[]{ new URL("file:"+NAILGUN+TARGET) },
+ xmlClassLoader
+ );
+ classLoaderCacheValues.put(nailgunKey, nailgunClassLoader);
+ }
+
+ if(args[0].equals("check-alive")){
+ System.exit(33);
+ return;
}
+
+ new URLClassLoader(
+ new URL[]{ new URL("file:"+STAGE1+TARGET) },
+ classLoaderCacheValues.get(
+ classLoaderCacheKeys.get( NAILGUN+TARGET )
+ )
+ )
+ .loadClass("cbt.Stage1")
+ .getMethod("main", String[].class)
+ .invoke( null/* _cls.newInstance()*/, (Object) args );
+ }
+}
+
+/*
+protected class MyURLClassLoader extends URLClassLoader{
+ public String toString(){
+ return super.toString() + "(\n " + Arrays.toString(urls) + "\n)";
}
}
+*/