src/Pure/System/isabelle_process.scala
author wenzelm
Mon, 20 May 2024 15:43:51 +0200
changeset 80182 29f2b8ff84f3
parent 79053 badb3da19ac6
child 80224 db92e0b6a11a
permissions -rw-r--r--
proper support for "isabelle update -D DIR": avoid accidental exclusion of select_dirs (amending e5dafe9e120f);
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
73897
0ddb5de0506e clarified signature: prefer Java interfaces;
wenzelm
parents: 73803
diff changeset
    10
import java.util.{Map => JMap}
65310
da9f1ef8ef7c more process arguments;
wenzelm
parents: 65225
diff changeset
    11
import java.io.{File => JFile}
da9f1ef8ef7c more process arguments;
wenzelm
parents: 65225
diff changeset
    12
da9f1ef8ef7c more process arguments;
wenzelm
parents: 65225
diff changeset
    13
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73897
diff changeset
    14
object Isabelle_Process {
73802
8d9ac6cfc270 clarified signature;
wenzelm
parents: 73367
diff changeset
    15
  def start(
65216
060a8a1f2dec tuned signature;
wenzelm
parents: 62754
diff changeset
    16
    options: Options,
76729
b045b40a65cc clarified signature;
wenzelm
parents: 76656
diff changeset
    17
    session: Session,
76656
a8f452f7c503 clarified names;
wenzelm
parents: 76655
diff changeset
    18
    session_background: Sessions.Background,
77414
0d5994eef9e6 clarified signature: allow to provide session_heaps by different means, e.g. from tmp directory or alternative session structure;
wenzelm
parents: 77368
diff changeset
    19
    session_heaps: List[Path],
71639
ec84f542e411 clarified signature of ML_Process vs. Isabelle_Process: proper support for "isabelle build -P -b";
wenzelm
parents: 71607
diff changeset
    20
    use_prelude: List[String] = Nil,
ec84f542e411 clarified signature of ML_Process vs. Isabelle_Process: proper support for "isabelle build -P -b";
wenzelm
parents: 71607
diff changeset
    21
    eval_main: String = "",
65216
060a8a1f2dec tuned signature;
wenzelm
parents: 62754
diff changeset
    22
    modes: List[String] = Nil,
65310
da9f1ef8ef7c more process arguments;
wenzelm
parents: 65225
diff changeset
    23
    cwd: JFile = null,
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73897
diff changeset
    24
    env: JMap[String, String] = Isabelle_System.settings()
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73897
diff changeset
    25
  ): Isabelle_Process = {
79053
badb3da19ac6 disable unix_domain for now: somewhat unstable, e.g. "isabelle build -b HOL-Analysis" on arm64_32-darwin (studio1);
wenzelm
parents: 79050
diff changeset
    26
    val channel = System_Channel()
62556
c115e69f457f more abstract Session.start, without prover command-line;
wenzelm
parents: 62555
diff changeset
    27
    val process =
57916
2c2c24dbf0a4 generic process wrapping in Prover;
wenzelm
parents: 57915
diff changeset
    28
      try {
76729
b045b40a65cc clarified signature;
wenzelm
parents: 76656
diff changeset
    29
        val ml_options =
b045b40a65cc clarified signature;
wenzelm
parents: 76656
diff changeset
    30
          options.
b045b40a65cc clarified signature;
wenzelm
parents: 76656
diff changeset
    31
            string.update("system_channel_address", channel.address).
69572
09a6a7c04b45 more robust system channel via options that are private to the user;
wenzelm
parents: 68209
diff changeset
    32
            string.update("system_channel_password", channel.password)
77414
0d5994eef9e6 clarified signature: allow to provide session_heaps by different means, e.g. from tmp directory or alternative session structure;
wenzelm
parents: 77368
diff changeset
    33
        ML_Process(ml_options, session_background, session_heaps,
71639
ec84f542e411 clarified signature of ML_Process vs. Isabelle_Process: proper support for "isabelle build -P -b";
wenzelm
parents: 71607
diff changeset
    34
          use_prelude = use_prelude, eval_main = eval_main,
ec84f542e411 clarified signature of ML_Process vs. Isabelle_Process: proper support for "isabelle build -P -b";
wenzelm
parents: 71607
diff changeset
    35
          modes = modes, cwd = cwd, env = env)
57916
2c2c24dbf0a4 generic process wrapping in Prover;
wenzelm
parents: 57915
diff changeset
    36
      }
69572
09a6a7c04b45 more robust system channel via options that are private to the user;
wenzelm
parents: 68209
diff changeset
    37
      catch { case exn @ ERROR(_) => channel.shutdown(); throw exn }
57917
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    38
73802
8d9ac6cfc270 clarified signature;
wenzelm
parents: 73367
diff changeset
    39
    val isabelle_process = new Isabelle_Process(session, process)
73803
2141d6c83511 tuned --- potentially more robust (e.g. session.phase_changed vs. isabelle_process.terminated);
wenzelm
parents: 73802
diff changeset
    40
    process.stdin.close()
73802
8d9ac6cfc270 clarified signature;
wenzelm
parents: 73367
diff changeset
    41
    session.start(receiver => new Prover(receiver, session.cache, channel, process))
8d9ac6cfc270 clarified signature;
wenzelm
parents: 73367
diff changeset
    42
8d9ac6cfc270 clarified signature;
wenzelm
parents: 73367
diff changeset
    43
    isabelle_process
57917
8ce97e5d545f tuned signature;
wenzelm
parents: 57916
diff changeset
    44
  }
57916
2c2c24dbf0a4 generic process wrapping in Prover;
wenzelm
parents: 57915
diff changeset
    45
}
71604
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
    46
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73897
diff changeset
    47
class Isabelle_Process private(session: Session, process: Bash.Process) {
71607
d97f504c8145 clarified Isabelle_Process phases;
wenzelm
parents: 71605
diff changeset
    48
  private val startup = Future.promise[String]
d97f504c8145 clarified Isabelle_Process phases;
wenzelm
parents: 71605
diff changeset
    49
  private val terminated = Future.promise[Process_Result]
71604
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
    50
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
    51
  session.phase_changed +=
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
    52
    Session.Consumer(getClass.getName) {
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
    53
      case Session.Ready =>
71607
d97f504c8145 clarified Isabelle_Process phases;
wenzelm
parents: 71605
diff changeset
    54
        startup.fulfill("")
d97f504c8145 clarified Isabelle_Process phases;
wenzelm
parents: 71605
diff changeset
    55
      case Session.Terminated(result) =>
d97f504c8145 clarified Isabelle_Process phases;
wenzelm
parents: 71605
diff changeset
    56
        if (!result.ok && !startup.is_finished) {
76488
1eed7e1300ed clarified signature: more public operations;
wenzelm
parents: 75393
diff changeset
    57
          val syslog = session.syslog.content()
77368
wenzelm
parents: 76729
diff changeset
    58
          val err = "Session startup failed" + if_proper(syslog, ":\n" + syslog)
71607
d97f504c8145 clarified Isabelle_Process phases;
wenzelm
parents: 71605
diff changeset
    59
          startup.fulfill(err)
d97f504c8145 clarified Isabelle_Process phases;
wenzelm
parents: 71605
diff changeset
    60
        }
d97f504c8145 clarified Isabelle_Process phases;
wenzelm
parents: 71605
diff changeset
    61
        terminated.fulfill(result)
71604
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
    62
      case _ =>
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
    63
    }
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
    64
71607
d97f504c8145 clarified Isabelle_Process phases;
wenzelm
parents: 71605
diff changeset
    65
  def await_startup(): Isabelle_Process =
d97f504c8145 clarified Isabelle_Process phases;
wenzelm
parents: 71605
diff changeset
    66
    startup.join match {
d97f504c8145 clarified Isabelle_Process phases;
wenzelm
parents: 71605
diff changeset
    67
      case "" => this
d97f504c8145 clarified Isabelle_Process phases;
wenzelm
parents: 71605
diff changeset
    68
      case err => session.stop(); error(err)
71604
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
    69
    }
c6fa217c9d5e clarified signature: more robust startup_join;
wenzelm
parents: 71598
diff changeset
    70
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73897
diff changeset
    71
  def await_shutdown(): Process_Result = {
71667
4d2de35214c5 proper treatment of protocol exceptions and prover termination: avoid session.stop while saving image;
wenzelm
parents: 71639
diff changeset
    72
    val result = terminated.join
4d2de35214c5 proper treatment of protocol exceptions and prover termination: avoid session.stop while saving image;
wenzelm
parents: 71639
diff changeset
    73
    session.stop()
4d2de35214c5 proper treatment of protocol exceptions and prover termination: avoid session.stop while saving image;
wenzelm
parents: 71639
diff changeset
    74
    result
4d2de35214c5 proper treatment of protocol exceptions and prover termination: avoid session.stop while saving image;
wenzelm
parents: 71639
diff changeset
    75
  }
71718
54ac957c53ec more robust interrupts;
wenzelm
parents: 71667
diff changeset
    76
73367
77ef8bef0593 clarified signature --- fewer warnings;
wenzelm
parents: 73340
diff changeset
    77
  def terminate(): Unit = process.terminate()
71667
4d2de35214c5 proper treatment of protocol exceptions and prover termination: avoid session.stop while saving image;
wenzelm
parents: 71639
diff changeset
    78
}