diff options
author | Li Haoyi <32282535+lihaoyi-databricks@users.noreply.github.com> | 2019-01-11 00:03:25 -0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2019-01-11 00:03:25 -0800 |
commit | 12a2d08ad8873dce6bcb70cf83d3983d136a91b5 (patch) | |
tree | 9eea11c22331a340eccbe29361d687c4234d07ff /scalalib/worker | |
parent | fc005caf191dd26dedbef931ecad3e84fd1a251a (diff) | |
download | mill-12a2d08ad8873dce6bcb70cf83d3983d136a91b5.tar.gz mill-12a2d08ad8873dce6bcb70cf83d3983d136a91b5.tar.bz2 mill-12a2d08ad8873dce6bcb70cf83d3983d136a91b5.zip |
More improvements to ZincWorkerImpl (#526)
* More improvements to ZincWorkerImpl
- Cache classloaders separately from `ScalaInstance`s
- Pre-compute `analysisMap` to speed up lookups
- Allow compile-to-jar using sbt/zinc 1.3.0-m1
* Update build.sc
* Update ZincWorkerModule.scala
* Update ZincWorkerImpl.scala
Diffstat (limited to 'scalalib/worker')
-rw-r--r-- | scalalib/worker/src/ZincWorkerImpl.scala | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/scalalib/worker/src/ZincWorkerImpl.scala b/scalalib/worker/src/ZincWorkerImpl.scala index ac681045..7914a10a 100644 --- a/scalalib/worker/src/ZincWorkerImpl.scala +++ b/scalalib/worker/src/ZincWorkerImpl.scala @@ -25,8 +25,9 @@ class ZincWorkerImpl(compilerBridge: Either[ ], libraryJarNameGrep: (Agg[os.Path], String) => os.Path, compilerJarNameGrep: (Agg[os.Path], String) => os.Path, - compilerCache: KeyedLockedCache[Compilers]) - extends ZincWorkerApi{ + compilerCache: KeyedLockedCache[Compilers], + compileToJar: Boolean) + extends ZincWorkerApi{ private val ic = new sbt.internal.inc.IncrementalCompilerImpl() lazy val javaOnlyCompilers = { // Keep the classpath as written by the user @@ -195,6 +196,19 @@ class ZincWorkerImpl(compilerBridge: Either[ } } + // for now this just grows unbounded; YOLO + val classloaderCache = collection.mutable.LinkedHashMap.empty[Long, ClassLoader] + + def getCachedClassLoader(compilersSig: Long, + combinedCompilerJars: Array[java.io.File]) + (implicit ctx: ZincWorkerApi.Ctx)= { + classloaderCache.synchronized{ + classloaderCache.getOrElseUpdate( + compilersSig, + mill.api.ClassLoader.create(combinedCompilerJars.map(_.toURI.toURL), null) + ) + } + } private def withCompilers[T](scalaVersion: String, scalaOrganization: String, compilerClasspath: Agg[os.Path], @@ -214,7 +228,7 @@ class ZincWorkerImpl(compilerBridge: Either[ val compilersSig = compilerBridgeSig + - combinedCompilerClasspath.map(p => p.toString().hashCode + os.mtime(p)).sum + combinedCompilerClasspath.map(p => p.toString().hashCode + os.mtime(p)).sum compilerCache.withCachedValue(compilersSig){ val compilerJar = @@ -224,7 +238,7 @@ class ZincWorkerImpl(compilerBridge: Either[ compilerJarNameGrep(compilerClasspath, scalaVersion) val scalaInstance = new ScalaInstance( version = scalaVersion, - loader = mill.api.ClassLoader.create(combinedCompilerJars.map(_.toURI.toURL), null), + loader = getCachedClassLoader(compilersSig, combinedCompilerJars), libraryJar = libraryJarNameGrep(compilerClasspath, scalaVersion).toIO, compilerJar = compilerJar.toIO, allJars = combinedCompilerJars, @@ -258,21 +272,21 @@ class ZincWorkerImpl(compilerBridge: Either[ l } + val analysisMap0 = upstreamCompileOutput.map(_.swap).toMap + def analysisMap(f: File): Optional[CompileAnalysis] = { - if (f.isFile) { - Optional.empty[CompileAnalysis] - } else { - upstreamCompileOutput.collectFirst { - case (zincPath, classFiles) if classFiles.toNIO == f.toPath => - FileAnalysisStore.binary(zincPath.toIO).get().map[CompileAnalysis](_.getAnalysis) - }.getOrElse(Optional.empty[CompileAnalysis]) + analysisMap0.get(os.Path(f)) match{ + case Some(zincPath) => FileAnalysisStore.binary(zincPath.toIO).get().map[CompileAnalysis](_.getAnalysis) + case None => Optional.empty[CompileAnalysis] } } val lookup = MockedLookup(analysisMap) val zincFile = ctx.dest / 'zinc - val classesDir = ctx.dest / 'classes + val classesDir = + if (compileToJar) ctx.dest / "classes.jar" + else ctx.dest / "classes" val zincIOFile = zincFile.toIO val classesIODir = classesDir.toIO @@ -302,7 +316,8 @@ class ZincWorkerImpl(compilerBridge: Either[ pr = { val prev = store.get() PreviousResult.of(prev.map(_.getAnalysis), prev.map(_.getMiniSetup)) - } + }, + Optional.empty[java.io.File] ) try { |