| author | blanchet | 
| Mon, 04 Apr 2016 09:45:04 +0200 | |
| changeset 62842 | db9f95ca2a8f | 
| parent 62713 | c18a68a3a1f1 | 
| child 62878 | 1cec457e0a03 | 
| 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 | 
| 46119 
0d7172a7672c
tuned signature -- emphasize special nature of protocol commands;
 wenzelm parents: 
45666diff
changeset | 10 | val protocol_command: string -> (string list -> unit) -> unit | 
| 52655 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 11 | val reset_tracing: Document_ID.exec -> unit | 
| 43684 | 12 | val crashes: exn list Synchronized.var | 
| 62564 | 13 | val init_protocol: string -> unit | 
| 62563 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 14 | val init_options: unit -> unit | 
| 62599 
f35858c831e5
clarified session build options: already provided by ML_Process;
 wenzelm parents: 
62564diff
changeset | 15 | val init_protocol_options: Options.T -> 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 | |
| 30 | ||
| 46119 
0d7172a7672c
tuned signature -- emphasize special nature of protocol commands;
 wenzelm parents: 
45666diff
changeset | 31 | (* protocol commands *) | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 32 | |
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 33 | local | 
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 34 | |
| 43684 | 35 | val commands = | 
| 52800 
1baa5d19ac44
less aggressive flushing: cope with massive amounts of protocol messages, e.g. from threads_trace;
 wenzelm parents: 
52799diff
changeset | 36 | Synchronized.var "Isabelle_Process.commands" | 
| 
1baa5d19ac44
less aggressive flushing: cope with massive amounts of protocol messages, e.g. from threads_trace;
 wenzelm parents: 
52799diff
changeset | 37 | (Symtab.empty: (string list -> unit) Symtab.table); | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 38 | |
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 39 | in | 
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 40 | |
| 46119 
0d7172a7672c
tuned signature -- emphasize special nature of protocol commands;
 wenzelm parents: 
45666diff
changeset | 41 | fun protocol_command name cmd = | 
| 43684 | 42 | Synchronized.change commands (fn cmds => | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 43 | (if not (Symtab.defined cmds name) then () | 
| 52582 | 44 |     else warning ("Redefining Isabelle protocol command " ^ quote name);
 | 
| 43684 | 45 | Symtab.update (name, cmd) cmds)); | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 46 | |
| 46119 
0d7172a7672c
tuned signature -- emphasize special nature of protocol commands;
 wenzelm parents: 
45666diff
changeset | 47 | fun run_command name args = | 
| 43684 | 48 | (case Symtab.lookup (Synchronized.value commands) name of | 
| 52582 | 49 |     NONE => error ("Undefined Isabelle protocol command " ^ quote name)
 | 
| 46119 
0d7172a7672c
tuned signature -- emphasize special nature of protocol commands;
 wenzelm parents: 
45666diff
changeset | 50 | | SOME cmd => | 
| 59056 
cbe9563c03d1
even more exception traces for Document.update, which goes through additional execution wrappers;
 wenzelm parents: 
59055diff
changeset | 51 | (Runtime.exn_trace_system (fn () => cmd args) | 
| 59055 
5a7157b8e870
more informative failure of protocol commands, with exception trace;
 wenzelm parents: 
58850diff
changeset | 52 |         handle _ (*sic!*) => error ("Isabelle protocol command failure: " ^ quote name)));
 | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 53 | |
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 54 | end; | 
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 55 | |
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 56 | |
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 57 | (* restricted tracing messages *) | 
| 49647 | 58 | |
| 52105 | 59 | val tracing_messages = | 
| 60 | Synchronized.var "tracing_messages" (Inttab.empty: int Inttab.table); | |
| 49647 | 61 | |
| 52655 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 62 | fun reset_tracing exec_id = | 
| 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 63 | Synchronized.change tracing_messages (Inttab.delete_safe exec_id); | 
| 49647 | 64 | |
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 65 | fun update_tracing () = | 
| 50911 
ee7fe4230642
more explicit treatment of (optional) exception properties, notably for "serial" -- avoid conflict with startPosition = offset;
 wenzelm parents: 
50715diff
changeset | 66 | (case Position.parse_id (Position.thread_data ()) of | 
| 49647 | 67 | NONE => () | 
| 52655 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 68 | | SOME exec_id => | 
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 69 | let | 
| 52560 | 70 | val ok = | 
| 52105 | 71 | 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 | 72 | let | 
| 52655 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 73 | val n = the_default 0 (Inttab.lookup tab exec_id) + 1; | 
| 52105 | 74 | val ok = n <= Options.default_int "editor_tracing_messages"; | 
| 52655 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 75 | 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 | 76 | in | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 77 | if ok then () | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 78 | else | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 79 | let | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 80 | val (text, promise) = Active.dialog_text (); | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 81 | val _ = | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 82 |               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 | 83 | text "100" ^ ", " ^ text "1000" ^ ", " ^ text "10000" ^ " messages?") | 
| 50505 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 84 | val m = Markup.parse_int (Future.join promise) | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 85 | handle Fail _ => error "Stopped"; | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 86 | in | 
| 52105 | 87 | Synchronized.change tracing_messages | 
| 52655 
3b2b1ef13979
more careful termination of removed execs, leaving running execs undisturbed;
 wenzelm parents: 
52584diff
changeset | 88 | (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 | 89 | end | 
| 
33c92722cc3d
smarter handling of tracing messages: prover process pauses and enters user dialog;
 wenzelm parents: 
50503diff
changeset | 90 | end); | 
| 49647 | 91 | |
| 92 | ||
| 52800 
1baa5d19ac44
less aggressive flushing: cope with massive amounts of protocol messages, e.g. from threads_trace;
 wenzelm parents: 
52799diff
changeset | 93 | (* output channels *) | 
| 28188 | 94 | |
| 52854 
92932931bd82
more general Output.result: allow to update arbitrary properties;
 wenzelm parents: 
52852diff
changeset | 95 | val serial_props = Markup.serial_properties o serial; | 
| 
92932931bd82
more general Output.result: allow to update arbitrary properties;
 wenzelm parents: 
52852diff
changeset | 96 | |
| 48712 
6b7a9bcc0bae
simplified process startup phases: INIT suffices for is_ready;
 wenzelm parents: 
48710diff
changeset | 97 | fun init_channels channel = | 
| 28189 
fbad2eb5be9e
auto_flush: uniform block buffering for all output streams;
 wenzelm parents: 
28188diff
changeset | 98 | let | 
| 40134 
8baded087d34
explicit message_output thread, with flushing after timeout, ensure atomic user-operations without the danger of IO Interrupt;
 wenzelm parents: 
40133diff
changeset | 99 | 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 | 100 | val _ = TextIO.StreamIO.setBufferMode (TextIO.getOutstream TextIO.stdErr, 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 | 101 | |
| 52584 | 102 | val msg_channel = Message_Channel.make channel; | 
| 52580 
36aa39694ab4
fall back on synchronous message output for single-threaded SML/NJ;
 wenzelm parents: 
52578diff
changeset | 103 | |
| 52800 
1baa5d19ac44
less aggressive flushing: cope with massive amounts of protocol messages, e.g. from threads_trace;
 wenzelm parents: 
52799diff
changeset | 104 | fun message name props body = | 
| 
1baa5d19ac44
less aggressive flushing: cope with massive amounts of protocol messages, e.g. from threads_trace;
 wenzelm parents: 
52799diff
changeset | 105 | Message_Channel.send msg_channel (Message_Channel.message name props body); | 
| 
1baa5d19ac44
less aggressive flushing: cope with massive amounts of protocol messages, e.g. from threads_trace;
 wenzelm parents: 
52799diff
changeset | 106 | |
| 52854 
92932931bd82
more general Output.result: allow to update arbitrary properties;
 wenzelm parents: 
52852diff
changeset | 107 | fun standard_message props name body = | 
| 56333 
38f1422ef473
support bulk messages consisting of small string segments, which are more healthy to the Poly/ML RTS and might prevent spurious GC crashes such as MTGCProcessMarkPointers::ScanAddressesInObject;
 wenzelm parents: 
56303diff
changeset | 108 | if forall (fn s => s = "") body then () | 
| 52580 
36aa39694ab4
fall back on synchronous message output for single-threaded SML/NJ;
 wenzelm parents: 
52578diff
changeset | 109 | else | 
| 57913 | 110 | let | 
| 111 | val props' = | |
| 112 | (case (Properties.defined props Markup.idN, Position.get_id (Position.thread_data ())) of | |
| 113 | (false, SOME id') => props @ [(Markup.idN, id')] | |
| 114 | | _ => props); | |
| 115 | in message name props' body end; | |
| 28044 | 116 | in | 
| 55387 
51f0876f61df
seal system channels at end of Pure bootstrap -- Isabelle/Scala provides official interfaces;
 wenzelm parents: 
54671diff
changeset | 117 | Output.status_fn := standard_message [] Markup.statusN; | 
| 
51f0876f61df
seal system channels at end of Pure bootstrap -- Isabelle/Scala provides official interfaces;
 wenzelm parents: 
54671diff
changeset | 118 | Output.report_fn := standard_message [] Markup.reportN; | 
| 
51f0876f61df
seal system channels at end of Pure bootstrap -- Isabelle/Scala provides official interfaces;
 wenzelm parents: 
54671diff
changeset | 119 | Output.result_fn := | 
| 52854 
92932931bd82
more general Output.result: allow to update arbitrary properties;
 wenzelm parents: 
52852diff
changeset | 120 | (fn props => fn s => standard_message (props @ serial_props ()) Markup.resultN s); | 
| 55387 
51f0876f61df
seal system channels at end of Pure bootstrap -- Isabelle/Scala provides official interfaces;
 wenzelm parents: 
54671diff
changeset | 121 | Output.writeln_fn := (fn s => standard_message (serial_props ()) Markup.writelnN s); | 
| 59184 
830bb7ddb3ab
explicit message channels for "state", "information";
 wenzelm parents: 
59056diff
changeset | 122 | Output.state_fn := (fn s => standard_message (serial_props ()) Markup.stateN s); | 
| 
830bb7ddb3ab
explicit message channels for "state", "information";
 wenzelm parents: 
59056diff
changeset | 123 | Output.information_fn := (fn s => standard_message (serial_props ()) Markup.informationN s); | 
| 55387 
51f0876f61df
seal system channels at end of Pure bootstrap -- Isabelle/Scala provides official interfaces;
 wenzelm parents: 
54671diff
changeset | 124 | Output.tracing_fn := | 
| 52854 
92932931bd82
more general Output.result: allow to update arbitrary properties;
 wenzelm parents: 
52852diff
changeset | 125 | (fn s => (update_tracing (); standard_message (serial_props ()) Markup.tracingN s)); | 
| 55387 
51f0876f61df
seal system channels at end of Pure bootstrap -- Isabelle/Scala provides official interfaces;
 wenzelm parents: 
54671diff
changeset | 126 | Output.warning_fn := (fn s => standard_message (serial_props ()) Markup.warningN s); | 
| 59203 
5f0bd5afc16d
explicit message channel for "legacy", which is nonetheless a variant of "warning";
 wenzelm parents: 
59184diff
changeset | 127 | Output.legacy_fn := (fn s => standard_message (serial_props ()) Markup.legacyN s); | 
| 55387 
51f0876f61df
seal system channels at end of Pure bootstrap -- Isabelle/Scala provides official interfaces;
 wenzelm parents: 
54671diff
changeset | 128 | Output.error_message_fn := | 
| 52854 
92932931bd82
more general Output.result: allow to update arbitrary properties;
 wenzelm parents: 
52852diff
changeset | 129 | (fn (i, s) => standard_message (Markup.serial_properties i) Markup.errorN s); | 
| 57975 
c657c68a60ab
explicit system message for protocol failure -- show on Syslog panel instead of Raw Output;
 wenzelm parents: 
56895diff
changeset | 130 | Output.system_message_fn := message Markup.systemN []; | 
| 55387 
51f0876f61df
seal system channels at end of Pure bootstrap -- Isabelle/Scala provides official interfaces;
 wenzelm parents: 
54671diff
changeset | 131 | Output.protocol_message_fn := message Markup.protocolN; | 
| 56333 
38f1422ef473
support bulk messages consisting of small string segments, which are more healthy to the Poly/ML RTS and might prevent spurious GC crashes such as MTGCProcessMarkPointers::ScanAddressesInObject;
 wenzelm parents: 
56303diff
changeset | 132 | message Markup.initN [] [Session.welcome ()]; | 
| 52584 | 133 | msg_channel | 
| 28044 | 134 | end; | 
| 25841 | 135 | |
| 136 | ||
| 39234 
d76a2fd129b5
main command loops are supposed to be uninterruptible -- no special treatment here;
 wenzelm parents: 
38871diff
changeset | 137 | (* protocol loop -- uninterruptible *) | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 138 | |
| 43684 | 139 | val crashes = Synchronized.var "Isabelle_Process.crashes" ([]: exn list); | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 140 | |
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 141 | local | 
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 142 | |
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 143 | fun recover crash = | 
| 43684 | 144 | (Synchronized.change crashes (cons crash); | 
| 57975 
c657c68a60ab
explicit system message for protocol failure -- show on Syslog panel instead of Raw Output;
 wenzelm parents: 
56895diff
changeset | 145 | Output.physical_stderr | 
| 
c657c68a60ab
explicit system message for protocol failure -- show on Syslog panel instead of Raw Output;
 wenzelm parents: 
56895diff
changeset | 146 | "Recovered from Isabelle process crash -- see also Isabelle_Process.crashes\n"); | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 147 | |
| 45029 
63144ea111f7
abstract System_Channel in ML (cf. Scala version);
 wenzelm parents: 
45028diff
changeset | 148 | fun read_chunk channel len = | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 149 | let | 
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 150 | val n = | 
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 151 | (case Int.fromString len of | 
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 152 | SOME n => n | 
| 52799 | 153 |       | NONE => error ("Isabelle process: malformed header " ^ quote len));
 | 
| 45029 
63144ea111f7
abstract System_Channel in ML (cf. Scala version);
 wenzelm parents: 
45028diff
changeset | 154 | val chunk = System_Channel.inputN channel n; | 
| 52799 | 155 | val i = size chunk; | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 156 | in | 
| 52799 | 157 | if i <> n then | 
| 158 |       error ("Isabelle process: bad chunk (unexpected EOF after " ^
 | |
| 159 | string_of_int i ^ " of " ^ string_of_int n ^ " bytes)") | |
| 160 | else chunk | |
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 161 | end; | 
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 162 | |
| 45029 
63144ea111f7
abstract System_Channel in ML (cf. Scala version);
 wenzelm parents: 
45028diff
changeset | 163 | fun read_command channel = | 
| 59055 
5a7157b8e870
more informative failure of protocol commands, with exception trace;
 wenzelm parents: 
58850diff
changeset | 164 | System_Channel.input_line channel | 
| 
5a7157b8e870
more informative failure of protocol commands, with exception trace;
 wenzelm parents: 
58850diff
changeset | 165 | |> Option.map (fn line => map (read_chunk channel) (space_explode "," line)); | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 166 | |
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 167 | in | 
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 168 | |
| 45029 
63144ea111f7
abstract System_Channel in ML (cf. Scala version);
 wenzelm parents: 
45028diff
changeset | 169 | fun loop channel = | 
| 59055 
5a7157b8e870
more informative failure of protocol commands, with exception trace;
 wenzelm parents: 
58850diff
changeset | 170 | let | 
| 
5a7157b8e870
more informative failure of protocol commands, with exception trace;
 wenzelm parents: 
58850diff
changeset | 171 | val continue = | 
| 
5a7157b8e870
more informative failure of protocol commands, with exception trace;
 wenzelm parents: 
58850diff
changeset | 172 | (case read_command channel of | 
| 
5a7157b8e870
more informative failure of protocol commands, with exception trace;
 wenzelm parents: 
58850diff
changeset | 173 | NONE => false | 
| 
5a7157b8e870
more informative failure of protocol commands, with exception trace;
 wenzelm parents: 
58850diff
changeset | 174 | | SOME [] => (Output.system_message "Isabelle process: no input"; true) | 
| 59370 
b13ff987c559
refrain from default task_context for all protocol commands, e.g. relevant for "build_theories" to admit Session.shutdown;
 wenzelm parents: 
59350diff
changeset | 175 | | SOME (name :: args) => (run_command name args; true)) | 
| 59055 
5a7157b8e870
more informative failure of protocol commands, with exception trace;
 wenzelm parents: 
58850diff
changeset | 176 | handle exn => (Runtime.exn_system_message exn handle crash => recover crash; true); | 
| 52770 
8c7cf864e270
pro-forma Goal.reset_futures, despite lack of final join/commit;
 wenzelm parents: 
52712diff
changeset | 177 | in | 
| 
8c7cf864e270
pro-forma Goal.reset_futures, despite lack of final join/commit;
 wenzelm parents: 
52712diff
changeset | 178 | if continue then loop channel | 
| 53192 | 179 | else (Future.shutdown (); Execution.reset (); ()) | 
| 52770 
8c7cf864e270
pro-forma Goal.reset_futures, despite lack of final join/commit;
 wenzelm parents: 
52712diff
changeset | 180 | end; | 
| 38270 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 181 | |
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 182 | end; | 
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 183 | |
| 
71bb3c273dd1
native Isabelle_Process commands, based on efficient byte channel protocol for string lists;
 wenzelm parents: 
38265diff
changeset | 184 | |
| 62564 | 185 | (* init protocol *) | 
| 25554 | 186 | |
| 59211 | 187 | val default_modes1 = [Syntax_Trans.no_bracketsN, Syntax_Trans.no_type_bracketsN]; | 
| 50715 
8cfd585b9162
prefer old graph browser in Isabelle/jEdit, which still produces better layout;
 wenzelm parents: 
50698diff
changeset | 188 | val default_modes2 = [Symbol.xsymbolsN, isabelle_processN, Pretty.symbolicN]; | 
| 49566 
66cbf8bb4693
basic integration of graphview into document model;
 wenzelm parents: 
49108diff
changeset | 189 | |
| 62564 | 190 | val init_protocol = uninterruptible (fn _ => fn socket => | 
| 38253 
3d4e521014f7
Isabelle_Process: separate input fifo for commands (still using the old tty protocol);
 wenzelm parents: 
38236diff
changeset | 191 | let | 
| 62666 | 192 | val _ = SHA1.test_samples () | 
| 62505 | 193 | handle exn as Fail msg => (Output.physical_stderr (msg ^ "\n"); Exn.reraise exn); | 
| 46548 
c54a4a22501c
clarified initial process startup errors: recover image load failure message (cf. 2cb7e34f6096) and suppress accidental output from raw ML toplevel;
 wenzelm parents: 
46121diff
changeset | 194 | val _ = Output.physical_stderr Symbol.STX; | 
| 39528 
c01d89d18ff0
refined Isabelle_Process startup: emit \002 before rendezvous on fifos, more robust treatment of startup failure with timeout, do not quit() after main loop;
 wenzelm parents: 
39513diff
changeset | 195 | |
| 49661 
ac48def96b69
enable show_markup by default (approx. double output size);
 wenzelm parents: 
49647diff
changeset | 196 | val _ = Printer.show_markup_default := true; | 
| 39528 
c01d89d18ff0
refined Isabelle_Process startup: emit \002 before rendezvous on fifos, more robust treatment of startup failure with timeout, do not quit() after main loop;
 wenzelm parents: 
39513diff
changeset | 197 | val _ = Context.set_thread_data NONE; | 
| 43671 
a250b092ac66
hard-wired print mode "xsymbols" increases chance that "iff" in HOL will print symbolic arrow;
 wenzelm parents: 
42897diff
changeset | 198 | val _ = | 
| 
a250b092ac66
hard-wired print mode "xsymbols" increases chance that "iff" in HOL will print symbolic arrow;
 wenzelm parents: 
42897diff
changeset | 199 | Unsynchronized.change print_mode | 
| 49566 
66cbf8bb4693
basic integration of graphview into document model;
 wenzelm parents: 
49108diff
changeset | 200 | (fn mode => (mode @ default_modes1) |> fold (update op =) default_modes2); | 
| 39528 
c01d89d18ff0
refined Isabelle_Process startup: emit \002 before rendezvous on fifos, more robust treatment of startup failure with timeout, do not quit() after main loop;
 wenzelm parents: 
39513diff
changeset | 201 | |
| 59350 
acba5d6fdb2f
discontinued fifo channel, always use portable socket;
 wenzelm parents: 
59211diff
changeset | 202 | val channel = System_Channel.rendezvous socket; | 
| 52584 | 203 | val msg_channel = init_channels channel; | 
| 52111 
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
 wenzelm parents: 
52105diff
changeset | 204 | val _ = Session.init_protocol_handlers (); | 
| 58848 | 205 | val _ = loop channel; | 
| 52584 | 206 | in Message_Channel.shutdown msg_channel end); | 
| 25528 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 207 | |
| 62563 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 208 | |
| 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 209 | (* init options *) | 
| 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 210 | |
| 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 211 | fun init_options () = | 
| 62712 | 212 | (ML_Pretty.print_depth (Options.default_int "ML_print_depth"); | 
| 213 | Future.ML_statistics := Options.default_bool "ML_statistics"; | |
| 62563 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 214 | 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 | 215 | Multithreading.max_threads_update (Options.default_int "threads"); | 
| 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 216 | Goal.parallel_proofs := Options.default_int "parallel_proofs"); | 
| 
2e352f63d15f
separate Isabelle_Process.init_options after Options.load_defaults, notably for "isabelle console";
 wenzelm parents: 
62505diff
changeset | 217 | |
| 62599 
f35858c831e5
clarified session build options: already provided by ML_Process;
 wenzelm parents: 
62564diff
changeset | 218 | fun init_protocol_options options = | 
| 
f35858c831e5
clarified session build options: already provided by ML_Process;
 wenzelm parents: 
62564diff
changeset | 219 | (Options.set_default options; | 
| 
f35858c831e5
clarified session build options: already provided by ML_Process;
 wenzelm parents: 
62564diff
changeset | 220 | init_options (); | 
| 
f35858c831e5
clarified session build options: already provided by ML_Process;
 wenzelm parents: 
62564diff
changeset | 221 | Goal.parallel_proofs := (if Options.int options "parallel_proofs" > 0 then 3 else 0)); | 
| 
f35858c831e5
clarified session build options: already provided by ML_Process;
 wenzelm parents: 
62564diff
changeset | 222 | |
| 25528 
e67230c2b952
Isabelle process wrapper -- interaction via external program.
 wenzelm parents: diff
changeset | 223 | end; |