equal
deleted
inserted
replaced
8 |
8 |
9 |
9 |
10 import java.io.{IOException, Writer, Reader, InputStreamReader, BufferedReader} |
10 import java.io.{IOException, Writer, Reader, InputStreamReader, BufferedReader} |
11 |
11 |
12 |
12 |
13 class TTY_Loop(writer: Writer, reader: Reader, |
13 class TTY_Loop( |
14 writer_lock: AnyRef = new Object, |
14 writer: Writer, |
15 interrupt: Option[() => Unit] = None) |
15 reader: Reader, |
|
16 writer_lock: AnyRef = new Object) |
16 { |
17 { |
17 private val console_output = Future.thread[Unit]("console_output") { |
18 private val console_output = Future.thread[Unit]("console_output", uninterruptible = true) { |
18 try { |
19 try { |
19 var result = new StringBuilder(100) |
20 val result = new StringBuilder(100) |
20 var finished = false |
21 var finished = false |
21 while (!finished) { |
22 while (!finished) { |
22 var c = -1 |
23 var c = -1 |
23 var done = false |
24 var done = false |
24 while (!done && (result.isEmpty || reader.ready)) { |
25 while (!done && (result.isEmpty || reader.ready)) { |
38 } |
39 } |
39 } |
40 } |
40 catch { case e: IOException => case Exn.Interrupt() => } |
41 catch { case e: IOException => case Exn.Interrupt() => } |
41 } |
42 } |
42 |
43 |
43 private val console_input = Future.thread[Unit]("console_input") { |
44 private val console_input = Future.thread[Unit]("console_input", uninterruptible = true) { |
44 val console_reader = new BufferedReader(new InputStreamReader(System.in)) |
45 val console_reader = new BufferedReader(new InputStreamReader(System.in)) |
45 def body |
46 try { |
46 { |
47 var finished = false |
47 try { |
48 while (!finished) { |
48 var finished = false |
49 console_reader.readLine() match { |
49 while (!finished) { |
50 case null => |
50 console_reader.readLine() match { |
51 writer.close() |
51 case null => |
52 finished = true |
52 writer.close() |
53 case line => |
53 finished = true |
54 writer_lock.synchronized { |
54 case line => |
55 writer.write(line) |
55 writer_lock.synchronized { |
56 writer.write("\n") |
56 writer.write(line) |
57 writer.flush() |
57 writer.write("\n") |
58 } |
58 writer.flush() |
|
59 } |
|
60 } |
|
61 } |
59 } |
62 } |
60 } |
63 catch { case e: IOException => case Exn.Interrupt() => } |
|
64 } |
61 } |
65 interrupt match { |
62 catch { case e: IOException => case Exn.Interrupt() => } |
66 case None => body |
|
67 case Some(int) => POSIX_Interrupt.handler { int() } { body } |
|
68 } |
|
69 } |
63 } |
70 |
64 |
71 def join { console_output.join; console_input.join } |
65 def join { console_output.join; console_input.join } |
72 |
66 |
73 def cancel { console_input.cancel } |
67 def cancel { console_input.cancel } |