--- a/src/Pure/ML/ml_console.scala Mon Apr 06 21:04:33 2020 +0200
+++ b/src/Pure/ML/ml_console.scala Mon Apr 06 21:07:38 2020 +0200
@@ -74,16 +74,11 @@
else Some(Sessions.base_info(
options, logic, dirs = dirs, include_sessions = include_sessions).check_base))
- val tty_loop = new TTY_Loop(process.stdin, process.stdout, Some(process.interrupt _))
- val process_result = Future.thread[Int]("process_result") {
+ POSIX_Interrupt.handler { process.interrupt } {
+ new TTY_Loop(process.stdin, process.stdout).join
val rc = process.join
- tty_loop.cancel // FIXME does not quite work, cannot interrupt blocking read on System.in
- rc
+ if (rc != 0) sys.exit(rc)
}
- tty_loop.join
-
- val rc = process_result.join
- if (rc != 0) sys.exit(rc)
}
}
}
--- a/src/Pure/System/tty_loop.scala Mon Apr 06 21:04:33 2020 +0200
+++ b/src/Pure/System/tty_loop.scala Mon Apr 06 21:07:38 2020 +0200
@@ -10,13 +10,14 @@
import java.io.{IOException, Writer, Reader, InputStreamReader, BufferedReader}
-class TTY_Loop(writer: Writer, reader: Reader,
- writer_lock: AnyRef = new Object,
- interrupt: Option[() => Unit] = None)
+class TTY_Loop(
+ writer: Writer,
+ reader: Reader,
+ writer_lock: AnyRef = new Object)
{
- private val console_output = Future.thread[Unit]("console_output") {
+ private val console_output = Future.thread[Unit]("console_output", uninterruptible = true) {
try {
- var result = new StringBuilder(100)
+ val result = new StringBuilder(100)
var finished = false
while (!finished) {
var c = -1
@@ -40,32 +41,25 @@
catch { case e: IOException => case Exn.Interrupt() => }
}
- private val console_input = Future.thread[Unit]("console_input") {
+ private val console_input = Future.thread[Unit]("console_input", uninterruptible = true) {
val console_reader = new BufferedReader(new InputStreamReader(System.in))
- def body
- {
- try {
- var finished = false
- while (!finished) {
- console_reader.readLine() match {
- case null =>
- writer.close()
- finished = true
- case line =>
- writer_lock.synchronized {
- writer.write(line)
- writer.write("\n")
- writer.flush()
- }
- }
+ try {
+ var finished = false
+ while (!finished) {
+ console_reader.readLine() match {
+ case null =>
+ writer.close()
+ finished = true
+ case line =>
+ writer_lock.synchronized {
+ writer.write(line)
+ writer.write("\n")
+ writer.flush()
+ }
}
}
- catch { case e: IOException => case Exn.Interrupt() => }
}
- interrupt match {
- case None => body
- case Some(int) => POSIX_Interrupt.handler { int() } { body }
- }
+ catch { case e: IOException => case Exn.Interrupt() => }
}
def join { console_output.join; console_input.join }
--- a/src/Pure/Tools/server.scala Mon Apr 06 21:04:33 2020 +0200
+++ b/src/Pure/Tools/server.scala Mon Apr 06 21:07:38 2020 +0200
@@ -173,12 +173,11 @@
private val out = new BufferedOutputStream(socket.getOutputStream)
private val out_lock: AnyRef = new Object
- def tty_loop(interrupt: Option[() => Unit] = None): TTY_Loop =
+ def tty_loop(): TTY_Loop =
new TTY_Loop(
new OutputStreamWriter(out),
new InputStreamReader(in),
- writer_lock = out_lock,
- interrupt = interrupt)
+ writer_lock = out_lock)
def read_password(password: String): Boolean =
try { Byte_Message.read_line(in).map(_.text) == Some(password) }