From d227b6423f897c46c07a895f4cbd923125510675 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Fri, 17 Jul 2020 15:49:36 -0700 Subject: [PATCH] Clear singleton TaskProgress between runs In db4878c78600f4c80cf81d97ea915c3d5fee17fe, TaskProgress became an object which mostly made things easier to reason about. The one problem was that it started leaking tasks with every run because the timings map would accumulate tasks that weren't cleared. To fix this, we can clear the timings and activeTasksMap in the TaskProgress object in the afterAllCompleted callback. Some extra null checks needed to be added since it's possible for the maps to not contain a previously added key after reset has been called. --- .../main/scala/sbt/internal/AbstractTaskProgress.scala | 10 +++++++++- main/src/main/scala/sbt/internal/TaskProgress.scala | 9 +++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/main/src/main/scala/sbt/internal/AbstractTaskProgress.scala b/main/src/main/scala/sbt/internal/AbstractTaskProgress.scala index 082c18419..61e93050b 100644 --- a/main/src/main/scala/sbt/internal/AbstractTaskProgress.scala +++ b/main/src/main/scala/sbt/internal/AbstractTaskProgress.scala @@ -42,7 +42,10 @@ private[sbt] abstract class AbstractTaskExecuteProgress extends ExecuteProgress[ } override def afterWork[A](task: Task[A], result: Either[Task[A], Result[A]]): Unit = { - timings.get(task).stop() + timings.get(task) match { + case null => + case t => t.stop() + } activeTasksMap.remove(task) // we need this to infer anonymous task names @@ -51,6 +54,11 @@ private[sbt] abstract class AbstractTaskExecuteProgress extends ExecuteProgress[ } } + protected def reset(): Unit = { + activeTasksMap.clear() + timings.clear() + } + private[this] val taskNameCache = TrieMap.empty[Task[_], String] protected def taskName(t: Task[_]): String = taskNameCache.getOrElseUpdate(t, taskName0(t)) diff --git a/main/src/main/scala/sbt/internal/TaskProgress.scala b/main/src/main/scala/sbt/internal/TaskProgress.scala index ed74d20b1..494520fcc 100644 --- a/main/src/main/scala/sbt/internal/TaskProgress.scala +++ b/main/src/main/scala/sbt/internal/TaskProgress.scala @@ -101,6 +101,7 @@ private[sbt] class TaskProgress private () } override def afterAllCompleted(results: RMap[Task, Result]): Unit = { + reset() // send an empty progress report to clear out the previous report appendProgress(ProgressEvent("Info", Vector(), Some(lastTaskCount.get), None, None)) } @@ -132,8 +133,12 @@ private[sbt] class TaskProgress private () StandardMain.exchange.updateProgress(event) private[this] def active: Vector[Task[_]] = activeTasks.toVector.filterNot(Def.isDummy) private[this] def activeExceedingThreshold: Vector[(Task[_], Long)] = active.flatMap { task => - val elapsed = timings.get(task).currentElapsedMicros - if (elapsed.micros > threshold) Some[(Task[_], Long)](task -> elapsed) else None + timings.get(task) match { + case null => None + case t => + val elapsed = t.currentElapsedMicros + if (elapsed.micros > threshold) Some[(Task[_], Long)](task -> elapsed) else None + } } private[this] def report(): Unit = { val currentTasks = activeExceedingThreshold