src/Pure/System/tty_loop.scala
changeset 71713 928fd852f3e2
parent 71383 8313dca6dee9
child 73340 0ffcad1f6130
equal deleted inserted replaced
71712:c6b7f4da67b3 71713:928fd852f3e2
     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 }