diff options
author | Christopher Vogt <oss.nsp@cvogt.org> | 2016-03-15 02:44:20 -0400 |
---|---|---|
committer | Christopher Vogt <oss.nsp@cvogt.org> | 2016-03-19 21:13:49 -0400 |
commit | 27ff278767edf5972782ec7568c1da7fb3019ed6 (patch) | |
tree | 345247dba9994aa572ebb0cffee7a9ed580a7090 | |
parent | 1da86970a6f6a801fa42c1cc4e0468bbb74e4ef4 (diff) | |
download | cbt-27ff278767edf5972782ec7568c1da7fb3019ed6.tar.gz cbt-27ff278767edf5972782ec7568c1da7fb3019ed6.tar.bz2 cbt-27ff278767edf5972782ec7568c1da7fb3019ed6.zip |
More speedup by already caching some classloaders in NailgunLauncher. Also fix a few warnings.
-rwxr-xr-x | cbt | 16 | ||||
-rw-r--r-- | nailgun_launcher/NailgunLauncher.java | 84 | ||||
-rw-r--r-- | stage1/CheckAlive.scala | 7 |
3 files changed, 67 insertions, 40 deletions
@@ -158,7 +158,7 @@ stage1 () { if [ $changed -eq 1 ]; then rm $NAILGUN$TARGET/cbt/*.class 2>/dev/null # defensive delete of potentially broken class files echo "Compiling cbt/nailgun_launcher" 1>&2 - javac -Xlint:deprecation -d $NAILGUN$TARGET `ls $NAILGUN*.java` + javac -Xlint:deprecation -Xlint:unchecked -d $NAILGUN$TARGET `ls $NAILGUN*.java` compiles=$? if [ $compiles -ne 0 ]; then rm $NAILGUN$TARGET/cbt/*.class 2>/dev/null # triggers recompilation next time. @@ -199,14 +199,14 @@ stage1 () { then log "Running JVM directly" $* # -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=localhost:5005 - java -cp $NAILGUN$TARGET cbt.NailgunLauncher $mainClass $CP "$CWD" $* + java -cp $NAILGUN$TARGET cbt.NailgunLauncher "$CWD" $* else log "Running via nailgun." $* for i in 0 1 2 3 4 5 6 7 8 9; do log "Adding classpath." $* $NG ng-cp $NAILGUN$TARGET >> $nailgun_out 2>> $nailgun_err log "Checking if nailgun is up yet." $* - $NG cbt.NailgunLauncher cbt.CheckAlive $CP "$CWD" $* >> $nailgun_out 2>> $nailgun_err + $NG cbt.NailgunLauncher check-alive >> $nailgun_out 2>> $nailgun_err alive=$? if [ $alive -eq 131 ] || [ $alive -eq 33 ]; then # the 33 is not working right now @@ -215,14 +215,14 @@ stage1 () { break else log "Nope. Sleeping for 0.5 seconds" $* - if [ "$i" -gt "1" ]; then - echo "Waiting for nailgun to start... (For problems try -Dlog=nailgun or check logs in cbt/nailgun_launcher/target/*.log)" 1>&2 - fi + #if [ "$i" -gt 1 ]; then + # echo "Waiting for nailgun to start... (In case of problems try -Dlog=nailgun or check logs in cbt/nailgun_launcher/target/*.log)" 1>&2 + #fi fi - sleep 0.5 + sleep 0.3 done log "Running $mainClass via Nailgun." $* - $NG cbt.NailgunLauncher $mainClass $CP "$CWD" $* + $NG cbt.NailgunLauncher "$CWD" $* fi exitCode=$? log "Done running $mainClass." $* 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)"; } } +*/ diff --git a/stage1/CheckAlive.scala b/stage1/CheckAlive.scala deleted file mode 100644 index e2a21a5..0000000 --- a/stage1/CheckAlive.scala +++ /dev/null @@ -1,7 +0,0 @@ -package cbt - -object CheckAlive{ - def main(args: Array[String]): Unit = { - System.exit(33) - } -} |