src/Pure/System/isabelle_process.scala
author wenzelm
Mon, 07 Mar 2016 18:20:22 +0100
changeset 62545 8ebffdaf2ce2
parent 62309 96c9a259d275
child 62548 f8ebb715e06d
permissions -rw-r--r--
Bash.process always uses a closed script instead of an open argument list, for extra robustness on Windows, where quoting is not well-defined; more robust File.bash_escape; more robust treatment of ML_OPTIONS; clarified prover args (again);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43283
446e6621762d updated headers;
wenzelm
parents: 40848
diff changeset
     1
/*  Title:      Pure/System/isabelle_process.scala
27949
6eb0327c0b9b Isabelle process management -- always reactive due to multi-threaded I/O.
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
6eb0327c0b9b Isabelle process management -- always reactive due to multi-threaded I/O.
wenzelm
parents:
diff changeset
     3
57916
2c2c24dbf0a4 generic process wrapping in Prover;
wenzelm
parents: 57915
diff changeset
     4
Isabelle process wrapper.
27949
6eb0327c0b9b Isabelle process management -- always reactive due to multi-threaded I/O.
wenzelm
parents:
diff changeset
     5
*/
6eb0327c0b9b Isabelle process management -- always reactive due to multi-threaded I/O.
wenzelm
parents:
diff changeset
     6
6eb0327c0b9b Isabelle process management -- always reactive due to multi-threaded I/O.
wenzelm
parents:
diff changeset
     7
package isabelle
6eb0327c0b9b Isabelle process management -- always reactive due to multi-threaded I/O.
wenzelm
parents:
diff changeset
     8
55618
995162143ef4 tuned imports;
wenzelm
parents: 54443
diff changeset
     9
57917
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    10
object Isabelle_Process
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    11
{
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    12
  def apply(
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    13
    receiver: Prover.Message => Unit = Console.println(_),
62545
8ebffdaf2ce2 Bash.process always uses a closed script instead of an open argument list, for extra robustness on Windows, where quoting is not well-defined;
wenzelm
parents: 62309
diff changeset
    14
    prover_args: List[String] = Nil): Isabelle_Process =
57917
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    15
  {
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    16
    val system_channel = System_Channel()
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    17
    val system_process =
57916
2c2c24dbf0a4 generic process wrapping in Prover;
wenzelm
parents: 57915
diff changeset
    18
      try {
62545
8ebffdaf2ce2 Bash.process always uses a closed script instead of an open argument list, for extra robustness on Windows, where quoting is not well-defined;
wenzelm
parents: 62309
diff changeset
    19
        val process =
8ebffdaf2ce2 Bash.process always uses a closed script instead of an open argument list, for extra robustness on Windows, where quoting is not well-defined;
wenzelm
parents: 62309
diff changeset
    20
          Bash.process("\"$ISABELLE_PROCESS\" -P " + File.bash_escape(system_channel.server_name) +
8ebffdaf2ce2 Bash.process always uses a closed script instead of an open argument list, for extra robustness on Windows, where quoting is not well-defined;
wenzelm
parents: 62309
diff changeset
    21
            " " + File.bash_escape(prover_args))
57916
2c2c24dbf0a4 generic process wrapping in Prover;
wenzelm
parents: 57915
diff changeset
    22
        process.stdin.close
2c2c24dbf0a4 generic process wrapping in Prover;
wenzelm
parents: 57915
diff changeset
    23
        process
2c2c24dbf0a4 generic process wrapping in Prover;
wenzelm
parents: 57915
diff changeset
    24
      }
60215
5fb4990dfc73 misc tuning, based on warnings by IntelliJ IDEA;
wenzelm
parents: 57917
diff changeset
    25
      catch { case exn @ ERROR(_) => system_channel.accepted(); throw exn }
57917
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    26
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    27
    new Isabelle_Process(receiver, system_channel, system_process)
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    28
  }
57916
2c2c24dbf0a4 generic process wrapping in Prover;
wenzelm
parents: 57915
diff changeset
    29
}
27949
6eb0327c0b9b Isabelle process management -- always reactive due to multi-threaded I/O.
wenzelm
parents:
diff changeset
    30
57917
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    31
class Isabelle_Process private(
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    32
    receiver: Prover.Message => Unit,
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    33
    system_channel: System_Channel,
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    34
    system_process: Prover.System_Process)
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    35
  extends Prover(receiver, system_channel, system_process)
62309
96c9a259d275 tuned whitespace;
wenzelm
parents: 62308
diff changeset
    36
{
96c9a259d275 tuned whitespace;
wenzelm
parents: 62308
diff changeset
    37
  def encode(s: String): String = Symbol.encode(s)
96c9a259d275 tuned whitespace;
wenzelm
parents: 62308
diff changeset
    38
  def decode(s: String): String = Symbol.decode(s)
96c9a259d275 tuned whitespace;
wenzelm
parents: 62308
diff changeset
    39
}