# HG changeset patch # User wenzelm # Date 1676889271 -3600 # Node ID f8aa1647d156cd0bc43d72425b0559e381c04c4d # Parent 6a6231370432557eb3a0244771958668b4310fde more elementary data structures, to fit better to SQL database; diff -r 6a6231370432 -r f8aa1647d156 src/Pure/Tools/build_process.scala --- a/src/Pure/Tools/build_process.scala Mon Feb 20 10:51:16 2023 +0100 +++ b/src/Pure/Tools/build_process.scala Mon Feb 20 11:34:31 2023 +0100 @@ -9,7 +9,6 @@ import scala.math.Ordering -import scala.collection.immutable.SortedSet import scala.annotation.tailrec @@ -136,6 +135,12 @@ /* main */ + case class Entry(name: String, deps: List[String]) { + def is_ready: Boolean = deps.isEmpty + def resolve(dep: String): Entry = + if (deps.contains(dep)) copy(deps = deps.filterNot(_ == dep)) else this + } + case class Result( current: Boolean, output_heap: SHA1.Shasum, @@ -179,21 +184,21 @@ // global state private val _numa_nodes = new NUMA.Nodes(numa_shuffling) - private var _build_graph = build_context.sessions_structure.build_graph - private var _build_order = SortedSet.from(_build_graph.keys)(build_context.ordering) + private var _pending: List[Build_Process.Entry] = + (for ((name, (_, (preds, _))) <- build_context.sessions_structure.build_graph.iterator) + yield Build_Process.Entry(name, preds.toList)).toList private var _running = Map.empty[String, Build_Job] private var _results = Map.empty[String, Build_Process.Result] private def remove_pending(name: String): Unit = synchronized { - _build_graph = _build_graph.del_node(name) - _build_order = _build_order - name + _pending = _pending.flatMap(entry => if (entry.name == name) None else Some(entry.resolve(name))) } private def next_pending(): Option[String] = synchronized { if (_running.size < (max_jobs max 1)) { - _build_order.iterator - .dropWhile(name => _running.isDefinedAt(name) || !_build_graph.is_minimal(name)) - .nextOption() + _pending.filter(entry => entry.is_ready && !_running.isDefinedAt(entry.name)) + .sortBy(_.name)(build_context.ordering) + .headOption.map(_.name) } else None } @@ -203,7 +208,7 @@ Set.from(for { job <- _running.valuesIterator; i <- job.numa_node } yield i)) } - private def test_running(): Boolean = synchronized { !_build_graph.is_empty } + private def test_running(): Boolean = synchronized { _pending.nonEmpty } private def stop_running(): Unit = synchronized { _running.valuesIterator.foreach(_.terminate()) }