From 814777e55356163111dcc52b310a4e010303efd0 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Thu, 15 Oct 2015 03:27:18 -0700 Subject: [PATCH] Optimize graph run. --- .../com/beust/kobalt/internal/DynamicGraph.kt | 7 ++- .../com/beust/kobalt/internal/TaskManager.kt | 57 ++++++++----------- 2 files changed, 29 insertions(+), 35 deletions(-) diff --git a/src/main/kotlin/com/beust/kobalt/internal/DynamicGraph.kt b/src/main/kotlin/com/beust/kobalt/internal/DynamicGraph.kt index 23d099e1..b89cc029 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/DynamicGraph.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/DynamicGraph.kt @@ -4,6 +4,7 @@ import com.beust.kobalt.misc.NamedThreadFactory import com.beust.kobalt.misc.ToString import com.beust.kobalt.misc.log import com.google.common.collect.ArrayListMultimap +import com.google.common.collect.HashMultimap import java.util.concurrent.* open class TaskResult2(success: Boolean, val value: T) : TaskResult(success) { @@ -88,8 +89,8 @@ public class DynamicGraph { private val nodesFinished = linkedSetOf() private val nodesInError = linkedSetOf() private val nodesSkipped = linkedSetOf() - private val dependedUpon = ArrayListMultimap.create() - private val dependingOn = ArrayListMultimap.create() + private val dependedUpon = HashMultimap.create() + private val dependingOn = HashMultimap.create() /** * Define a comparator for the nodes of this graph, which will be used @@ -156,7 +157,7 @@ public class DynamicGraph { /** * @return a list of all the nodes that have a status other than FINISHED. */ - private fun getUnfinishedNodes(nodes: List) : Collection { + private fun getUnfinishedNodes(nodes: Set) : Collection { val result = hashSetOf() nodes.forEach { node -> if (nodesReady.contains(node) || nodesRunning.contains(node)) { diff --git a/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt b/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt index cd9f3782..d91cf9e5 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt @@ -45,7 +45,6 @@ public class TaskManager @Inject constructor(val plugins: Plugins, val args: Arg public fun runTargets(targets: List, projects: List) : Int { var result = 0 - val tasksAlreadyRun = hashSetOf() projects.forEach { project -> val projectName = project.name!! val tasksByNames = hashMapOf() @@ -59,8 +58,8 @@ public class TaskManager @Inject constructor(val plugins: Plugins, val args: Arg log(1, " Building project ${project.name}") log(1, "") + val graph = DynamicGraph() targets.forEach { target -> - val graph = DynamicGraph() val ti = TaskInfo(target) if (ti.matches(projectName)) { @@ -84,10 +83,7 @@ public class TaskManager @Inject constructor(val plugins: Plugins, val args: Arg if (currentFreeTask.size() == 1) { currentFreeTask.get(0).let { val thisTaskInfo = TaskInfo(projectName, it.name) - if (! tasksAlreadyRun.contains(thisTaskInfo.id)) { - graph.addNode(it) - tasksAlreadyRun.add(thisTaskInfo.id) - } + graph.addNode(it) } } @@ -100,11 +96,7 @@ public class TaskManager @Inject constructor(val plugins: Plugins, val args: Arg rb.forEach { val to = tasksByNames.get(it) if (to != null) { - val taskInfo = TaskInfo(projectName, to.name) - if (! tasksAlreadyRun.contains(taskInfo.id)) { - graph.addEdge(pluginTask, to) - tasksAlreadyRun.add(taskInfo.id) - } + graph.addEdge(pluginTask, to) } else { throw KobaltException("Should have found $it") } @@ -125,29 +117,30 @@ public class TaskManager @Inject constructor(val plugins: Plugins, val args: Arg } } } - - log(2, "About to run graph:\n ${graph.dump()} ") - - // - // Now that we have a full graph, run it - // - val factory = object : IThreadWorkerFactory { - override public fun createWorkers(nodes: List): List> { - val result = arrayListOf>() - nodes.forEach { - result.add(TaskWorker(arrayListOf(it), args.dryRun)) - } - return result - } - } - - val executor = DynamicGraphExecutor(graph, factory) - val thisResult = executor.run() - if (result == 0) { - result = thisResult - } } } + + // + // Now that we have a full graph, run it + // + log(2, "About to run graph:\n ${graph.dump()} ") + + val factory = object : IThreadWorkerFactory { + override public fun createWorkers(nodes: List): List> { + val result = arrayListOf>() + nodes.forEach { + result.add(TaskWorker(arrayListOf(it), args.dryRun)) + } + return result + } + } + + val executor = DynamicGraphExecutor(graph, factory) + val thisResult = executor.run() + if (result == 0) { + result = thisResult + } + } return result }