# HG changeset patch # User wenzelm # Date 1676974842 -3600 # Node ID 1b7c5d4b97a88355fb08460ed1581478ed6df0f8 # Parent f30e050d4ac6ed38f6470797eb0a2ac409793d24 misc tuning and clarification; support SSH.System; diff -r f30e050d4ac6 -r 1b7c5d4b97a8 src/Pure/System/numa.scala --- a/src/Pure/System/numa.scala Tue Feb 21 11:19:39 2023 +0100 +++ b/src/Pure/System/numa.scala Tue Feb 21 11:20:42 2023 +0100 @@ -8,25 +8,28 @@ object NUMA { - /* available nodes */ + /* information about nodes */ - def nodes(): List[Int] = { - val numa_nodes_linux = Path.explode("/sys/devices/system/node/online") + private val numa_info_linux: Path = Path.explode("/sys/devices/system/node/online") - val Single = """^(\d+)$""".r - val Multiple = """^(\d+)-(\d+)$""".r + private val Info_Single = """^(\d+)$""".r + private val Info_Multiple = """^(\d+)-(\d+)$""".r - def read(s: String): List[Int] = - s match { - case Single(Value.Int(i)) => List(i) - case Multiple(Value.Int(i), Value.Int(j)) => (i to j).toList - case _ => error("Cannot parse CPU node specification: " + quote(s)) - } + private def parse_nodes(s: String): List[Int] = + s match { + case Info_Single(Value.Int(i)) => List(i) + case Info_Multiple(Value.Int(i), Value.Int(j)) => (i to j).toList + case _ => error("Cannot parse CPU node specification: " + quote(s)) + } - if (numa_nodes_linux.is_file) { - space_explode(',', File.read(numa_nodes_linux).trim).flatMap(read) - } - else Nil + def nodes(enabled: Boolean = true, ssh: SSH.System = SSH.Local): List[Int] = { + val numa_info = if (ssh.isabelle_platform.is_linux) Some(numa_info_linux) else None + for { + path <- numa_info.toList + if enabled && ssh.is_file(path) + s <- space_explode(',', ssh.read(path).trim) + n <- parse_nodes(s) + } yield n } diff -r f30e050d4ac6 -r 1b7c5d4b97a8 src/Pure/Tools/build_process.scala --- a/src/Pure/Tools/build_process.scala Tue Feb 21 11:19:39 2023 +0100 +++ b/src/Pure/Tools/build_process.scala Tue Feb 21 11:20:42 2023 +0100 @@ -119,7 +119,7 @@ } } - val numa_nodes = if (numa_shuffling) NUMA.nodes() else Nil + val numa_nodes = NUMA.nodes(enabled = numa_shuffling) new Context(store, deps, sessions, ordering, progress, numa_nodes, build_heap = build_heap, max_jobs = max_jobs, fresh_build = fresh_build, no_build = no_build, verbose = verbose, session_setup)