summaryrefslogtreecommitdiff
path: root/core/src/main/scala/mill/eval/Evaluator.scala
diff options
context:
space:
mode:
authorRoman Timushev <rtimush@gmail.com>2017-12-12 00:02:07 +0100
committerRoman Timushev <rtimush@gmail.com>2017-12-12 00:12:13 +0100
commitee7c879f078e33eda21f6e967f82f4a582959645 (patch)
treee9340f7440e1ee483de457aceae75038a75d29ae /core/src/main/scala/mill/eval/Evaluator.scala
parentb98c1ced9236eca4e23ccd4c7fe98d946a7308e8 (diff)
downloadmill-ee7c879f078e33eda21f6e967f82f4a582959645.tar.gz
mill-ee7c879f078e33eda21f6e967f82f4a582959645.tar.bz2
mill-ee7c879f078e33eda21f6e967f82f4a582959645.zip
Cache classloader signatures
Diffstat (limited to 'core/src/main/scala/mill/eval/Evaluator.scala')
-rw-r--r--core/src/main/scala/mill/eval/Evaluator.scala14
1 files changed, 9 insertions, 5 deletions
diff --git a/core/src/main/scala/mill/eval/Evaluator.scala b/core/src/main/scala/mill/eval/Evaluator.scala
index 63dd0813..c45f1744 100644
--- a/core/src/main/scala/mill/eval/Evaluator.scala
+++ b/core/src/main/scala/mill/eval/Evaluator.scala
@@ -1,6 +1,7 @@
package mill.eval
import java.net.URLClassLoader
+
import ammonite.ops._
import ammonite.runtime.SpecialClassLoader
import mill.define.{Graph, Target, Task}
@@ -29,12 +30,14 @@ class Evaluator(workspacePath: Path,
val evaluated = new OSet.Mutable[Task[_]]
val results = mutable.LinkedHashMap.empty[Task[_], Result[Any]]
+ val classLoaderSignatureCache = mutable.Map.empty[ClassLoader, Seq[(Path, Long)]]
for ((terminal, group)<- sortedGroups.items()){
val (newResults, newEvaluated) = evaluateGroupCached(
terminal,
group,
- results
+ results,
+ classLoaderSignatureCache
)
for(ev <- newEvaluated){
evaluated.append(ev)
@@ -62,18 +65,19 @@ class Evaluator(workspacePath: Path,
def evaluateGroupCached(terminal: Either[Task[_], LabelledTarget[_]],
group: OSet[Task[_]],
- results: collection.Map[Task[_], Result[Any]]): (collection.Map[Task[_], Result[Any]], Seq[Task[_]]) = {
+ results: collection.Map[Task[_], Result[Any]],
+ signatureCache: mutable.Map[ClassLoader, Seq[(Path, Long)]]): (collection.Map[Task[_], Result[Any]], Seq[Task[_]]) = {
val externalInputs = group.items.flatMap(_.inputs).filter(!group.contains(_))
// check if the build itself has changed
- val classLoaderSig = group.toVector.map { task =>
- task.getClass.getClassLoader match {
+ val classLoaderSig = group.toVector.map(_.getClass.getClassLoader).map { cl =>
+ signatureCache.getOrElseUpdate(cl, cl match {
case scl: SpecialClassLoader => scl.classpathSignature
case ucl: URLClassLoader => SpecialClassLoader.initialClasspathSignature(ucl)
case _ => Nil
- }
+ })
}
val inputsHash =