| author | wenzelm | 
| Fri, 23 Aug 2024 20:21:04 +0200 | |
| changeset 80749 | 232a839ef8e6 | 
| parent 80073 | 40f5ddeda2b4 | 
| child 80821 | eb383d50564b | 
| permissions | -rw-r--r-- | 
| 30173 
eabece26b89b
moved isabelle_process.ML, isabelle_process.scala, isar.ML, session.ML to Pure/System/ (together with associated Isar commands);
 wenzelm parents: 
29522diff
changeset | 1 | (* Title: Pure/System/isabelle_process.ML | 
| 25528 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 2 | Author: Makarius | 
| 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 3 | |
| 57916 | 4 | Isabelle process wrapper. | 
| 25528 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 5 | *) | 
| 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 6 | |
| 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 7 | signature ISABELLE_PROCESS = | 
| 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 8 | sig | 
| 42897 | 9 | val is_active: unit -> bool | 
| 52655 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 10 | val reset_tracing: Document_ID.exec -> unit | 
| 43684 | 11 | val crashes: exn list Synchronized.var | 
| 62563 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 12 | val init_options: unit -> unit | 
| 65300 | 13 | val init_options_interactive: unit -> unit | 
| 69572 
09a6a7c04b45
more robust system channel via options that are private to the user;
 wenzelm parents: 
69449diff
changeset | 14 | val init: unit -> unit | 
| 71644 | 15 | val init_build: unit -> unit | 
| 25528 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 16 | end; | 
| 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 17 | |
| 31797 | 18 | structure Isabelle_Process: ISABELLE_PROCESS = | 
| 25528 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 19 | struct | 
| 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 20 | |
| 42897 | 21 | (* print mode *) | 
| 25554 | 22 | |
| 25748 | 23 | val isabelle_processN = "isabelle_process"; | 
| 24 | ||
| 42897 | 25 | fun is_active () = Print_Mode.print_mode_active isabelle_processN; | 
| 26 | ||
| 26550 | 27 | val _ = Output.add_mode isabelle_processN Output.default_output Output.default_escape; | 
| 28036 | 28 | val _ = Markup.add_mode isabelle_processN YXML.output_markup; | 
| 25841 | 29 | |
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 30 | val protocol_modes1 = [Syntax_Trans.no_bracketsN, Syntax_Trans.no_type_bracketsN]; | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 31 | val protocol_modes2 = [isabelle_processN, Pretty.symbolicN]; | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 32 | |
| 25841 | 33 | |
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 34 | (* restricted tracing messages *) | 
| 49647 | 35 | |
| 52105 | 36 | val tracing_messages = | 
| 37 | Synchronized.var "tracing_messages" (Inttab.empty: int Inttab.table); | |
| 49647 | 38 | |
| 52655 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 39 | fun reset_tracing exec_id = | 
| 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 40 | Synchronized.change tracing_messages (Inttab.delete_safe exec_id); | 
| 49647 | 41 | |
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 42 | fun update_tracing () = | 
| 50911 
ee7fe4230642
more explicit treatment of (optional) exception properties, notably for "serial" -- avoid conflict with startPosition = offset;
 wenzelm parents: 
50715diff
changeset | 43 | (case Position.parse_id (Position.thread_data ()) of | 
| 49647 | 44 | NONE => () | 
| 52655 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 45 | | SOME exec_id => | 
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 46 | let | 
| 52560 | 47 | val ok = | 
| 52105 | 48 | Synchronized.change_result tracing_messages (fn tab => | 
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 49 | let | 
| 52655 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 50 | val n = the_default 0 (Inttab.lookup tab exec_id) + 1; | 
| 69103 
814a1ab42d70
unbounded tracing for proper termination, e.g. relevant for theory Sequents.Hard_Quantifiers;
 wenzelm parents: 
68025diff
changeset | 51 | val limit = Options.default_int "editor_tracing_messages"; | 
| 
814a1ab42d70
unbounded tracing for proper termination, e.g. relevant for theory Sequents.Hard_Quantifiers;
 wenzelm parents: 
68025diff
changeset | 52 | val ok = limit <= 0 orelse n <= limit; | 
| 52655 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 53 | in (ok, Inttab.update (exec_id, n) tab) end); | 
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 54 | in | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 55 | if ok then () | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 56 | else | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 57 | let | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 58 | val (text, promise) = Active.dialog_text (); | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 59 | val _ = | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 60 |               writeln ("Tracing paused.  " ^ text "Stop" ^ ", or continue with next " ^
 | 
| 51044 
890f502f0e89
more generous tracing limit, which is relevant for applications where this occurs routinely (e.g. HO unification trace);
 wenzelm parents: 
50911diff
changeset | 61 | text "100" ^ ", " ^ text "1000" ^ ", " ^ text "10000" ^ " messages?") | 
| 63806 | 62 | val m = Value.parse_int (Future.join promise) | 
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 63 | handle Fail _ => error "Stopped"; | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 64 | in | 
| 52105 | 65 | Synchronized.change tracing_messages | 
| 52655 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 66 | (Inttab.map_default (exec_id, 0) (fn k => k - m)) | 
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 67 | end | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 68 | end); | 
| 49647 | 69 | |
| 70 | ||
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 71 | (* init protocol -- uninterruptible *) | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 72 | |
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 73 | val crashes = Synchronized.var "Isabelle_Process.crashes" ([]: exn list); | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 74 | |
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 75 | local | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 76 | |
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 77 | fun recover crash = | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 78 | (Synchronized.change crashes (cons crash); | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 79 | Output.physical_stderr | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 80 | "Recovered from Isabelle process crash -- see also Isabelle_Process.crashes\n"); | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 81 | |
| 72119 
d115d50a19c0
provide POLYSTATSDIR to keep $HOME/.polyml clean (requires Poly/ML 52881757b127, otherwise ignored);
 wenzelm parents: 
72116diff
changeset | 82 | fun ml_statistics () = | 
| 
d115d50a19c0
provide POLYSTATSDIR to keep $HOME/.polyml clean (requires Poly/ML 52881757b127, otherwise ignored);
 wenzelm parents: 
72116diff
changeset | 83 | Output.protocol_message | 
| 
d115d50a19c0
provide POLYSTATSDIR to keep $HOME/.polyml clean (requires Poly/ML 52881757b127, otherwise ignored);
 wenzelm parents: 
72116diff
changeset | 84 |     (Markup.ML_statistics {pid = ML_Pid.get (), stats_dir = getenv "POLYSTATSDIR"}) [];
 | 
| 
d115d50a19c0
provide POLYSTATSDIR to keep $HOME/.polyml clean (requires Poly/ML 52881757b127, otherwise ignored);
 wenzelm parents: 
72116diff
changeset | 85 | |
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 86 | in | 
| 28188 | 87 | |
| 71644 | 88 | fun init_protocol modes = Thread_Attributes.uninterruptible (fn _ => fn (address, password) => | 
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 89 | let | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 90 | val _ = SHA1.test_samples () | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 91 | handle exn as Fail msg => (Output.physical_stderr (msg ^ "\n"); Exn.reraise exn); | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 92 | |
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 93 | val _ = Output.physical_stderr Symbol.STX; | 
| 52854 
92932931bd82
more general Output.result: allow to update arbitrary properties;
 wenzelm parents: 
52852diff
changeset | 94 | |
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 95 | |
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 96 | (* streams *) | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 97 | |
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 98 | val (in_stream, out_stream) = Socket_IO.open_streams address; | 
| 75577 
c51e1cef1eae
more scalable byte messages, notably for Scala functions in ML;
 wenzelm parents: 
73578diff
changeset | 99 | val _ = Byte_Message.write_line out_stream (Bytes.string password); | 
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 100 | |
| 40134 
8baded087d34
explicit message_output thread, with flushing after timeout, ensure atomic user-operations without the danger of IO Interrupt;
 wenzelm parents: 
40133diff
changeset | 101 | val _ = TextIO.StreamIO.setBufferMode (TextIO.getOutstream TextIO.stdOut, IO.LINE_BUF); | 
| 
8baded087d34
explicit message_output thread, with flushing after timeout, ensure atomic user-operations without the danger of IO Interrupt;
 wenzelm parents: 
40133diff
changeset | 102 | val _ = TextIO.StreamIO.setBufferMode (TextIO.getOutstream TextIO.stdErr, IO.LINE_BUF); | 
| 69449 | 103 | val _ = BinIO.StreamIO.setBufferMode (BinIO.getOutstream out_stream, IO.BLOCK_BUF); | 
| 40134 
8baded087d34
explicit message_output thread, with flushing after timeout, ensure atomic user-operations without the danger of IO Interrupt;
 wenzelm parents: 
40133diff
changeset | 104 | |
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 105 | |
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 106 | (* messages *) | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 107 | |
| 73577 | 108 | val message_channel = Message_Channel.make out_stream; | 
| 73578 | 109 | val message = Message_Channel.message message_channel; | 
| 52800 
1baa5d19ac44
less aggressive flushing: cope with massive amounts of protocol messages, e.g. from threads_trace;
 wenzelm parents: 
52799diff
changeset | 110 | |
| 70995 
2c17fa0f5187
more direct output of XML material -- bypass Buffer.T;
 wenzelm parents: 
70991diff
changeset | 111 | fun standard_message props name ss = | 
| 
2c17fa0f5187
more direct output of XML material -- bypass Buffer.T;
 wenzelm parents: 
70991diff
changeset | 112 | if forall (fn s => s = "") ss then () | 
| 52580 
36aa39694ab4
fall back on synchronous message output for single-threaded SML/NJ;
 wenzelm parents: 
52578diff
changeset | 113 | else | 
| 57913 | 114 | let | 
| 72709 
cb9d5af781b4
more complete report positions, notably for command 'back' (amending eca176f773e0);
 wenzelm parents: 
72158diff
changeset | 115 | val pos_props = | 
| 
cb9d5af781b4
more complete report positions, notably for command 'back' (amending eca176f773e0);
 wenzelm parents: 
72158diff
changeset | 116 | if exists Markup.position_property props then props | 
| 
cb9d5af781b4
more complete report positions, notably for command 'back' (amending eca176f773e0);
 wenzelm parents: 
72158diff
changeset | 117 | else props @ Position.properties_of (Position.thread_data ()); | 
| 73559 | 118 | in message name pos_props [XML.blob ss] end; | 
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 119 | |
| 71675 | 120 | fun report_message ss = | 
| 76804 | 121 | if Context_Position.reports_enabled0 () | 
| 71675 | 122 | then standard_message [] Markup.reportN ss else (); | 
| 123 | ||
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 124 | val serial_props = Markup.serial_properties o serial; | 
| 65212 
fd6bc719c98b
more robust startup/init: let Session.stop wait for protocol handler initialization;
 wenzelm parents: 
63806diff
changeset | 125 | |
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 126 | val message_context = | 
| 71675 | 127 | Unsynchronized.setmp Private_Output.status_fn (standard_message [] Markup.statusN) #> | 
| 128 | Unsynchronized.setmp Private_Output.report_fn report_message #> | |
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 129 | Unsynchronized.setmp Private_Output.result_fn | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 130 | (fn props => fn s => standard_message (props @ serial_props ()) Markup.resultN s) #> | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 131 | Unsynchronized.setmp Private_Output.writeln_fn | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 132 | (fn s => standard_message (serial_props ()) Markup.writelnN s) #> | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 133 | Unsynchronized.setmp Private_Output.state_fn | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 134 | (fn s => standard_message (serial_props ()) Markup.stateN s) #> | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 135 | Unsynchronized.setmp Private_Output.information_fn | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 136 | (fn s => standard_message (serial_props ()) Markup.informationN s) #> | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 137 | Unsynchronized.setmp Private_Output.tracing_fn | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 138 | (fn s => (update_tracing (); standard_message (serial_props ()) Markup.tracingN s)) #> | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 139 | Unsynchronized.setmp Private_Output.warning_fn | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 140 | (fn s => standard_message (serial_props ()) Markup.warningN s) #> | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 141 | Unsynchronized.setmp Private_Output.legacy_fn | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 142 | (fn s => standard_message (serial_props ()) Markup.legacyN s) #> | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 143 | Unsynchronized.setmp Private_Output.error_message_fn | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 144 | (fn (i, s) => standard_message (Markup.serial_properties i) Markup.errorN s) #> | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 145 | Unsynchronized.setmp Private_Output.system_message_fn | 
| 73559 | 146 | (fn ss => message Markup.systemN [] [XML.blob ss]) #> | 
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 147 | Unsynchronized.setmp Private_Output.protocol_message_fn | 
| 73559 | 148 | (fn props => fn chunks => message Markup.protocolN props chunks) #> | 
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 149 | Unsynchronized.setmp print_mode | 
| 71644 | 150 | ((! print_mode @ #1 modes) |> fold (update op =) (#2 modes)); | 
| 25841 | 151 | |
| 152 | ||
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 153 | (* protocol *) | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 154 | |
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 155 | fun protocol_loop () = | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 156 | let | 
| 78757 | 157 | fun main () = | 
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 158 | (case Byte_Message.read_message in_stream of | 
| 73225 
3ab0cedaccad
clarified modules: allow early definition of protocol commands;
 wenzelm parents: 
72709diff
changeset | 159 | NONE => raise Protocol_Command.STOP 0 | 
| 71667 
4d2de35214c5
proper treatment of protocol exceptions and prover termination: avoid session.stop while saving image;
 wenzelm parents: 
71656diff
changeset | 160 | | SOME [] => Output.system_message "Isabelle process: no input" | 
| 78725 
3c02ad5a1586
clarified treatment of exceptions: avoid catch-all handlers;
 wenzelm parents: 
78711diff
changeset | 161 | | SOME (name :: args) => Protocol_Command.run (Bytes.content name) args); | 
| 
3c02ad5a1586
clarified treatment of exceptions: avoid catch-all handlers;
 wenzelm parents: 
78711diff
changeset | 162 | val _ = | 
| 78757 | 163 | (case Exn.capture_body main of | 
| 78725 
3c02ad5a1586
clarified treatment of exceptions: avoid catch-all handlers;
 wenzelm parents: 
78711diff
changeset | 164 | Exn.Res () => () | 
| 
3c02ad5a1586
clarified treatment of exceptions: avoid catch-all handlers;
 wenzelm parents: 
78711diff
changeset | 165 | | Exn.Exn exn => | 
| 
3c02ad5a1586
clarified treatment of exceptions: avoid catch-all handlers;
 wenzelm parents: 
78711diff
changeset | 166 | if Protocol_Command.is_protocol_exn exn then Exn.reraise exn | 
| 
3c02ad5a1586
clarified treatment of exceptions: avoid catch-all handlers;
 wenzelm parents: 
78711diff
changeset | 167 | else | 
| 
3c02ad5a1586
clarified treatment of exceptions: avoid catch-all handlers;
 wenzelm parents: 
78711diff
changeset | 168 | (case Exn.capture Runtime.exn_system_message exn of | 
| 
3c02ad5a1586
clarified treatment of exceptions: avoid catch-all handlers;
 wenzelm parents: 
78711diff
changeset | 169 | Exn.Res () => () | 
| 
3c02ad5a1586
clarified treatment of exceptions: avoid catch-all handlers;
 wenzelm parents: 
78711diff
changeset | 170 | | Exn.Exn crash => recover crash)); | 
| 71667 
4d2de35214c5
proper treatment of protocol exceptions and prover termination: avoid session.stop while saving image;
 wenzelm parents: 
71656diff
changeset | 171 | in protocol_loop () end; | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 172 | |
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 173 | fun protocol () = | 
| 73559 | 174 | (message Markup.initN [] [[XML.Text (Session.welcome ())]]; | 
| 72158 | 175 | ml_statistics (); | 
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 176 | protocol_loop ()); | 
| 71631 | 177 | |
| 78758 | 178 | val result = Exn.capture_body (message_context protocol); | 
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 179 | |
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 180 | |
| 71637 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 181 | (* shutdown *) | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 182 | |
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 183 | val _ = Future.shutdown (); | 
| 
45c2b8cf1b26
more robust message_context and shutdown, e.g. after errors in protocol loop (see also 3f02bc5a5a03);
 wenzelm parents: 
71631diff
changeset | 184 | val _ = Execution.reset (); | 
| 73577 | 185 | val _ = Message_Channel.shutdown message_channel; | 
| 71638 | 186 | val _ = BinIO.closeIn in_stream; | 
| 187 | val _ = BinIO.closeOut out_stream; | |
| 71667 
4d2de35214c5
proper treatment of protocol exceptions and prover termination: avoid session.stop while saving image;
 wenzelm parents: 
71656diff
changeset | 188 | |
| 72104 | 189 | val _ = Options.reset_default (); | 
| 71656 
3e121f999120
clarified signature: more direct Isabelle_Process.EXIT;
 wenzelm parents: 
71644diff
changeset | 190 | in | 
| 
3e121f999120
clarified signature: more direct Isabelle_Process.EXIT;
 wenzelm parents: 
71644diff
changeset | 191 | (case result of | 
| 73225 
3ab0cedaccad
clarified modules: allow early definition of protocol commands;
 wenzelm parents: 
72709diff
changeset | 192 | Exn.Exn (Protocol_Command.STOP rc) => if rc = 0 then () else exit rc | 
| 71656 
3e121f999120
clarified signature: more direct Isabelle_Process.EXIT;
 wenzelm parents: 
71644diff
changeset | 193 | | _ => Exn.release result) | 
| 
3e121f999120
clarified signature: more direct Isabelle_Process.EXIT;
 wenzelm parents: 
71644diff
changeset | 194 | end); | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 195 | |
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 196 | end; | 
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 197 | |
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 198 | |
| 62563 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 199 | (* init options *) | 
| 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 200 | |
| 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 201 | fun init_options () = | 
| 62878 | 202 | (ML_Print_Depth.set_print_depth (Options.default_int "ML_print_depth"); | 
| 62563 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 203 | Multithreading.trace := Options.default_int "threads_trace"; | 
| 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 204 | Multithreading.max_threads_update (Options.default_int "threads"); | 
| 68025 | 205 | Multithreading.parallel_proofs := Options.default_int "parallel_proofs"; | 
| 78711 
3a3a70d4d422
clarified order of modules: early access to interrupt management of Isabelle_Threads;
 wenzelm parents: 
78018diff
changeset | 206 | Isabelle_Thread.threads_stack_limit := Options.default_real "threads_stack_limit"; | 
| 70914 
05c4c6a99b3f
option to export standardized proof terms (not scalable);
 wenzelm parents: 
69572diff
changeset | 207 | if Options.default_bool "export_standard_proofs" then Proofterm.proofs := 2 else (); | 
| 65448 
9bc3b57c1fa7
added system option record_proofs, which allows to build HOL-Proofs without special Proofs.thy;
 wenzelm parents: 
65303diff
changeset | 208 | let val proofs = Options.default_int "record_proofs" | 
| 
9bc3b57c1fa7
added system option record_proofs, which allows to build HOL-Proofs without special Proofs.thy;
 wenzelm parents: 
65303diff
changeset | 209 | in if proofs < 0 then () else Proofterm.proofs := proofs end; | 
| 78018 
dfa44d85d751
proper system options to control context tracing/timing;
 wenzelm parents: 
76804diff
changeset | 210 | Printer.show_markup_default := false; | 
| 
dfa44d85d751
proper system options to control context tracing/timing;
 wenzelm parents: 
76804diff
changeset | 211 | Context.theory_tracing := Options.default_bool "context_theory_tracing"; | 
| 
dfa44d85d751
proper system options to control context tracing/timing;
 wenzelm parents: 
76804diff
changeset | 212 | Context.proof_tracing := Options.default_bool "context_proof_tracing"; | 
| 80073 
40f5ddeda2b4
further performance tuning (after f906f7f83dae): interactive mode is closer to earlier approach with Lazy.value, which could be relevant with rather complex grammars under tight memory situations;
 wenzelm parents: 
78758diff
changeset | 213 | Context.data_timing := Options.default_bool "context_data_timing"; | 
| 
40f5ddeda2b4
further performance tuning (after f906f7f83dae): interactive mode is closer to earlier approach with Lazy.value, which could be relevant with rather complex grammars under tight memory situations;
 wenzelm parents: 
78758diff
changeset | 214 | Syntax.cache_persistent := false); | 
| 62563 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 215 | |
| 65300 | 216 | fun init_options_interactive () = | 
| 217 | (init_options (); | |
| 68025 | 218 | Multithreading.parallel_proofs := (if Options.default_int "parallel_proofs" > 0 then 3 else 0); | 
| 80073 
40f5ddeda2b4
further performance tuning (after f906f7f83dae): interactive mode is closer to earlier approach with Lazy.value, which could be relevant with rather complex grammars under tight memory situations;
 wenzelm parents: 
78758diff
changeset | 219 | Printer.show_markup_default := true; | 
| 
40f5ddeda2b4
further performance tuning (after f906f7f83dae): interactive mode is closer to earlier approach with Lazy.value, which could be relevant with rather complex grammars under tight memory situations;
 wenzelm parents: 
78758diff
changeset | 220 | Syntax.cache_persistent := true); | 
| 62599 
f35858c831e5
clarified session build options: already provided by ML_Process;
 wenzelm parents: 
62564diff
changeset | 221 | |
| 69572 
09a6a7c04b45
more robust system channel via options that are private to the user;
 wenzelm parents: 
69449diff
changeset | 222 | |
| 
09a6a7c04b45
more robust system channel via options that are private to the user;
 wenzelm parents: 
69449diff
changeset | 223 | (* generic init *) | 
| 
09a6a7c04b45
more robust system channel via options that are private to the user;
 wenzelm parents: 
69449diff
changeset | 224 | |
| 71644 | 225 | fun init_modes modes = | 
| 69572 
09a6a7c04b45
more robust system channel via options that are private to the user;
 wenzelm parents: 
69449diff
changeset | 226 | let | 
| 
09a6a7c04b45
more robust system channel via options that are private to the user;
 wenzelm parents: 
69449diff
changeset | 227 | val address = Options.default_string \<^system_option>\<open>system_channel_address\<close>; | 
| 
09a6a7c04b45
more robust system channel via options that are private to the user;
 wenzelm parents: 
69449diff
changeset | 228 | val password = Options.default_string \<^system_option>\<open>system_channel_password\<close>; | 
| 
09a6a7c04b45
more robust system channel via options that are private to the user;
 wenzelm parents: 
69449diff
changeset | 229 | in | 
| 
09a6a7c04b45
more robust system channel via options that are private to the user;
 wenzelm parents: 
69449diff
changeset | 230 | if address <> "" andalso password <> "" | 
| 71644 | 231 | then init_protocol modes (address, password) | 
| 69572 
09a6a7c04b45
more robust system channel via options that are private to the user;
 wenzelm parents: 
69449diff
changeset | 232 | else init_options () | 
| 
09a6a7c04b45
more robust system channel via options that are private to the user;
 wenzelm parents: 
69449diff
changeset | 233 | end; | 
| 
09a6a7c04b45
more robust system channel via options that are private to the user;
 wenzelm parents: 
69449diff
changeset | 234 | |
| 71644 | 235 | fun init () = init_modes (protocol_modes1, protocol_modes2); | 
| 236 | fun init_build () = init_modes ([], protocol_modes2); | |
| 237 | ||
| 25528 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 238 | end; |