aboutsummaryrefslogtreecommitdiff
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
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.
-rwxr-xr-xcbt16
-rw-r--r--nailgun_launcher/NailgunLauncher.java84
-rw-r--r--stage1/CheckAlive.scala7
3 files changed, 67 insertions, 40 deletions
diff --git a/cbt b/cbt
index a791c68..a5feb54 100755
--- a/cbt
+++ b/cbt
@@ -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)
- }
-}