| author | blanchet |
| Wed, 28 May 2014 13:31:44 +0200 | |
| changeset 57103 | c9e400a05c9e |
| parent 56533 | cd8b6d849b6a |
| child 57649 | a43898f76ae9 |
| permissions | -rw-r--r-- |
| 56210 | 1 |
(* Title: Pure/PIDE/session.ML |
|
52052
892061142ba6
discontinued obsolete isabelle usedir, mkdir, make;
wenzelm
parents:
52050
diff
changeset
|
2 |
Author: Makarius |
| 6346 | 3 |
|
| 56210 | 4 |
Prover session: persistent state of logic image. |
| 6346 | 5 |
*) |
6 |
||
7 |
signature SESSION = |
|
8 |
sig |
|
| 11509 | 9 |
val name: unit -> string |
| 6346 | 10 |
val welcome: unit -> string |
|
51399
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
wenzelm
parents:
51398
diff
changeset
|
11 |
val init: bool -> bool -> Path.T -> string -> bool -> string -> (string * string) list -> |
|
56533
cd8b6d849b6a
explicit 'document_files' in session ROOT specifications;
wenzelm
parents:
56530
diff
changeset
|
12 |
(Path.T * Path.T) list -> string -> string * string -> bool -> unit |
| 48457 | 13 |
val finish: unit -> unit |
|
52111
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
14 |
val protocol_handler: string -> unit |
|
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
15 |
val init_protocol_handlers: unit -> unit |
| 6346 | 16 |
end; |
17 |
||
18 |
structure Session: SESSION = |
|
19 |
struct |
|
20 |
||
|
52111
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
21 |
(** session identification -- not thread-safe **) |
| 6346 | 22 |
|
|
51399
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
wenzelm
parents:
51398
diff
changeset
|
23 |
val session = Unsynchronized.ref {chapter = "Pure", name = "Pure"};
|
| 32738 | 24 |
val session_finished = Unsynchronized.ref false; |
| 48542 | 25 |
|
|
51399
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
wenzelm
parents:
51398
diff
changeset
|
26 |
fun name () = "Isabelle/" ^ #name (! session); |
|
30173
eabece26b89b
moved isabelle_process.ML, isabelle_process.scala, isar.ML, session.ML to Pure/System/ (together with associated Isar commands);
wenzelm
parents:
29435
diff
changeset
|
27 |
|
|
26109
c69c3559355b
more elaborate structure Distribution (filled-in by makedist);
wenzelm
parents:
25840
diff
changeset
|
28 |
fun welcome () = |
| 26134 | 29 |
if Distribution.is_official then |
30 |
"Welcome to " ^ name () ^ " (" ^ Distribution.version ^ ")"
|
|
| 48990 | 31 |
else "Unofficial version of " ^ name () ^ " (" ^ Distribution.version ^ ")";
|
| 6346 | 32 |
|
33 |
||
|
51399
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
wenzelm
parents:
51398
diff
changeset
|
34 |
(* init *) |
| 9414 | 35 |
|
|
56533
cd8b6d849b6a
explicit 'document_files' in session ROOT specifications;
wenzelm
parents:
56530
diff
changeset
|
36 |
fun init build info info_path doc doc_graph doc_output doc_variants doc_files |
|
56530
5c178501cf78
removed obsolete doc_dump option (see also 892061142ba6);
wenzelm
parents:
56333
diff
changeset
|
37 |
parent (chapter, name) verbose = |
|
51399
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
wenzelm
parents:
51398
diff
changeset
|
38 |
if #name (! session) <> parent orelse not (! session_finished) then |
| 6346 | 39 |
error ("Unfinished parent session " ^ quote parent ^ " for " ^ quote name)
|
|
51399
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
wenzelm
parents:
51398
diff
changeset
|
40 |
else |
|
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
wenzelm
parents:
51398
diff
changeset
|
41 |
let |
|
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
wenzelm
parents:
51398
diff
changeset
|
42 |
val _ = session := {chapter = chapter, name = name};
|
|
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
wenzelm
parents:
51398
diff
changeset
|
43 |
val _ = session_finished := false; |
|
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
wenzelm
parents:
51398
diff
changeset
|
44 |
in |
|
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
wenzelm
parents:
51398
diff
changeset
|
45 |
Present.init build info info_path (if doc = "false" then "" else doc) |
|
56533
cd8b6d849b6a
explicit 'document_files' in session ROOT specifications;
wenzelm
parents:
56530
diff
changeset
|
46 |
doc_graph doc_output doc_variants doc_files (chapter, name) |
|
56530
5c178501cf78
removed obsolete doc_dump option (see also 892061142ba6);
wenzelm
parents:
56333
diff
changeset
|
47 |
verbose (map Thy_Info.get_theory (Thy_Info.get_names ())) |
|
51399
6ac3c29a300e
discontinued "isabelle usedir" option -r (reset session path);
wenzelm
parents:
51398
diff
changeset
|
48 |
end; |
| 6346 | 49 |
|
50 |
||
51 |
(* finish *) |
|
52 |
||
53 |
fun finish () = |
|
| 53192 | 54 |
(Execution.shutdown (); |
|
49911
262c36fd5f26
collective errors from use_thys and Session.finish/Goal.finish_futures -- avoid uninformative interrupts stemming from failure of goal forks that are not registered in the theory (e.g. unnamed theorems);
wenzelm
parents:
49895
diff
changeset
|
55 |
Thy_Info.finish (); |
|
262c36fd5f26
collective errors from use_thys and Session.finish/Goal.finish_futures -- avoid uninformative interrupts stemming from failure of goal forks that are not registered in the theory (e.g. unnamed theorems);
wenzelm
parents:
49895
diff
changeset
|
56 |
Present.finish (); |
|
262c36fd5f26
collective errors from use_thys and Session.finish/Goal.finish_futures -- avoid uninformative interrupts stemming from failure of goal forks that are not registered in the theory (e.g. unnamed theorems);
wenzelm
parents:
49895
diff
changeset
|
57 |
Outer_Syntax.check_syntax (); |
|
50430
702278df3b57
make double-sure that the future scheduler is properly shutdown, otherwise its threads are made persistent and will deadlock with the fresh instance after reloading the image (NB: Present.finish involves another Par_List.map over document_variants and thus might fork again);
wenzelm
parents:
50121
diff
changeset
|
58 |
Future.shutdown (); |
| 52050 | 59 |
Event_Timer.shutdown (); |
|
55386
0c15ac6edcf7
make triple-sure that the future scheduler is properly shutdown (see also 702278df3b57);
wenzelm
parents:
53192
diff
changeset
|
60 |
Future.shutdown (); |
|
49911
262c36fd5f26
collective errors from use_thys and Session.finish/Goal.finish_futures -- avoid uninformative interrupts stemming from failure of goal forks that are not registered in the theory (e.g. unnamed theorems);
wenzelm
parents:
49895
diff
changeset
|
61 |
session_finished := true); |
| 6346 | 62 |
|
|
52111
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
63 |
|
| 56210 | 64 |
|
|
52111
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
65 |
(** protocol handlers **) |
|
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
66 |
|
|
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
67 |
val protocol_handlers = Synchronized.var "protocol_handlers" ([]: string list); |
|
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
68 |
|
|
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
69 |
fun protocol_handler name = |
|
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
70 |
Synchronized.change protocol_handlers (fn handlers => |
|
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:
56210
diff
changeset
|
71 |
(Output.try_protocol_message (Markup.protocol_handler name) []; |
|
52111
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
72 |
if not (member (op =) handlers name) then () |
|
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
73 |
else warning ("Redefining protocol handler: " ^ quote name);
|
|
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
74 |
update (op =) name handlers)); |
|
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
75 |
|
|
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
76 |
fun init_protocol_handlers () = |
|
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
77 |
Synchronized.value protocol_handlers |
|
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:
56210
diff
changeset
|
78 |
|> List.app (fn name => Output.try_protocol_message (Markup.protocol_handler name) []); |
|
52111
1fd184eaa310
explicit management of Session.Protocol_Handlers, with protocol state and functions;
wenzelm
parents:
52083
diff
changeset
|
79 |
|
| 6346 | 80 |
end; |