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;
}
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);
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;