X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe-android/blobdiff_plain/25c3546915ef2105c0d53983939da840ddbde795..c8292b34485a2e00e676023d4164dd5841e4659f:/peers.scala diff --git a/peers.scala b/peers.scala index 931c8f4..76326be 100644 --- a/peers.scala +++ b/peers.scala @@ -23,36 +23,6 @@ val RX_REF = """(?x) \$ \( ([^)]+) \)""".r; val RX_RESOLVE = """(?x) \$ ([46*]*) \[ ([^\]]+) \]""".r; val RX_PARENT = """(?x) [^\s,]+""".r -def with_cleaner[T](body: Cleaner => T): T = { - val cleaner = new Cleaner; - try { body(cleaner) } - finally { cleaner.cleanup(); } -} - -class Cleaner { - var cleanups: List[() => Unit] = Nil; - def apply(cleanup: => Unit) { cleanups +:= { () => cleanup; } } - def cleanup() { cleanups foreach { _() } } -} - -def lines(r: Reader) = new Traversable[String] { - val in: BufferedReader = new BufferedReader(r); - override def foreach[T](f: String => T) { - while (true) in.readLine match { - case null => return; - case line => f(line); - } - } -} - -def thread(name: String, run: Boolean = true, daemon: Boolean = true) - (body: => Unit): Thread = { - val t = new Thread(new Runnable { override def run() { body } }, name); - t.setDaemon(daemon); - if (run) t.start(); - t -} - object BulkResolver { val BREAK = new Breaks; } @@ -93,14 +63,12 @@ class BulkResolver(val nthreads: Int = 8) { val workers = Array.tabulate(nthreads) { i => thread(s"resolver worker #$i") { - breakable { - while (true) { - val host = ch.read; if (host == null) break; + loopUnit { exit => + val host = ch.read; if (host == null) exit; println(s";; ${Thread.currentThread.getName} resolving `${host.name}'"); - try { - for (a <- InetAddress.getAllByName(host.name)) host.addaddr(a); - } catch { case e: UnknownHostException => () } - } + try { + for (a <- InetAddress.getAllByName(host.name)) host.addaddr(a); + } catch { case e: UnknownHostException => () } } println(s";; ${Thread.currentThread.getName} done'"); ch.write(null); @@ -274,7 +242,7 @@ class Config { conf => def parseFile(path: File): this.type = { println(s";; parse ${path.getPath}"); - with_cleaner { clean => + withCleaner { clean => val in = new FileReader(path); clean { in.close(); } val lno = 1;