src/Pure/Isar/session.ML
author wenzelm
Mon, 25 Feb 2008 17:27:41 +0100
changeset 26134 3b499feded50
parent 26109 c69c3559355b
child 26136 a5198555e3e0
permissions -rw-r--r--
welcome: actually check for ChangeLog.gz;
tuned structure Distribution;
wenzelm@6346
     1
(*  Title:      Pure/Isar/session.ML
wenzelm@6346
     2
    ID:         $Id$
wenzelm@6346
     3
    Author:     Markus Wenzel, TU Muenchen
wenzelm@6346
     4
wenzelm@6346
     5
Session management -- maintain state of logic images.
wenzelm@6346
     6
*)
wenzelm@6346
     7
wenzelm@6346
     8
signature SESSION =
wenzelm@6346
     9
sig
wenzelm@25840
    10
  val id: unit -> string list
wenzelm@11509
    11
  val name: unit -> string
wenzelm@6346
    12
  val welcome: unit -> string
wenzelm@24061
    13
  val use_dir: string -> bool -> string list -> bool -> bool -> string -> bool -> string list ->
wenzelm@24118
    14
    string -> string -> bool * string -> string -> int -> bool -> int -> int -> unit
wenzelm@6346
    15
  val finish: unit -> unit
wenzelm@6346
    16
end;
wenzelm@6346
    17
wenzelm@6346
    18
structure Session: SESSION =
wenzelm@6346
    19
struct
wenzelm@6346
    20
wenzelm@6346
    21
wenzelm@6346
    22
(* session state *)
wenzelm@6346
    23
wenzelm@16451
    24
val session = ref ([Context.PureN]: string list);
wenzelm@6346
    25
val session_path = ref ([]: string list);
wenzelm@6346
    26
val session_finished = ref false;
wenzelm@15979
    27
val remote_path = ref (NONE: Url.T option);
wenzelm@9414
    28
wenzelm@9414
    29
wenzelm@9414
    30
(* access path *)
wenzelm@6346
    31
wenzelm@25840
    32
fun id () = ! session;
wenzelm@6346
    33
fun path () = ! session_path;
wenzelm@6346
    34
wenzelm@16451
    35
fun str_of [] = Context.PureN
wenzelm@6346
    36
  | str_of elems = space_implode "/" elems;
wenzelm@6346
    37
wenzelm@11509
    38
fun name () = "Isabelle/" ^ str_of (path ());
wenzelm@26109
    39
wenzelm@26134
    40
val log = Path.explode "$ISABELLE_HOME/src/ChangeLog.gz";
wenzelm@26134
    41
wenzelm@26109
    42
fun welcome () =
wenzelm@26134
    43
  if Distribution.is_official then
wenzelm@26134
    44
    "Welcome to " ^ name () ^ " (" ^ Distribution.version ^ ")"
wenzelm@26134
    45
  else
wenzelm@26134
    46
    "Unofficial version of " ^ name () ^ " (" ^ Distribution.version ^ ")" ^
wenzelm@26134
    47
    (if File.exists log then "\nSee " ^ Path.implode (Path.expand log) ^ " for details" else "");
wenzelm@6346
    48
wenzelm@6346
    49
wenzelm@9414
    50
(* add_path *)
wenzelm@9414
    51
wenzelm@9414
    52
fun add_path reset s =
wenzelm@9414
    53
  let val sess = ! session @ [s] in
wenzelm@18964
    54
    (case duplicates (op =) sess of
wenzelm@9414
    55
      [] => (session := sess; session_path := ((if reset then [] else ! session_path) @ [s]))
wenzelm@9414
    56
    | dups => error ("Duplicate session identifiers " ^ commas_quote dups ^ " in " ^ str_of sess))
wenzelm@9414
    57
  end;
wenzelm@9414
    58
wenzelm@9414
    59
wenzelm@6346
    60
(* init *)
wenzelm@6346
    61
wenzelm@6346
    62
fun init reset parent name =
wenzelm@20664
    63
  if not (member (op =) (! session) parent) orelse not (! session_finished) then
wenzelm@6346
    64
    error ("Unfinished parent session " ^ quote parent ^ " for " ^ quote name)
wenzelm@6346
    65
  else (add_path reset name; session_finished := false);
wenzelm@6346
    66
wenzelm@6346
    67
wenzelm@6346
    68
(* finish *)
wenzelm@6346
    69
wenzelm@6346
    70
fun finish () =
wenzelm@16728
    71
  (Output.accumulated_time ();
wenzelm@16728
    72
    ThyInfo.finish ();
wenzelm@6346
    73
    Present.finish ();
wenzelm@21957
    74
    Toplevel.init_state ();
wenzelm@6346
    75
    session_finished := true);
wenzelm@6346
    76
wenzelm@6346
    77
wenzelm@6346
    78
(* use_dir *)
wenzelm@6346
    79
wenzelm@17207
    80
fun get_rpath rpath =
wenzelm@17207
    81
  (if rpath = "" then () else
wenzelm@15979
    82
     if is_some (! remote_path) then
berghofe@7227
    83
       error "Path for remote theory browsing information may only be set once"
berghofe@7227
    84
     else
wenzelm@21858
    85
       remote_path := SOME (Url.explode rpath);
wenzelm@17207
    86
   (! remote_path, rpath <> ""));
wenzelm@17207
    87
wenzelm@17207
    88
fun dumping (_, "") = NONE
wenzelm@21858
    89
  | dumping (cp, path) = SOME (cp, Path.explode path);
berghofe@7236
    90
wenzelm@17074
    91
fun use_dir root build modes reset info doc doc_graph doc_versions
wenzelm@24061
    92
    parent name dump rpath level verbose max_threads trace_threads =
wenzelm@23972
    93
  ((fn () =>
wenzelm@23972
    94
     (init reset parent name;
wenzelm@23972
    95
      Present.init build info doc doc_graph doc_versions (path ()) name
wenzelm@23972
    96
        (dumping dump) (get_rpath rpath) verbose (map ThyInfo.theory (ThyInfo.names ()));
wenzelm@25703
    97
      use root;
wenzelm@23972
    98
      finish ()))
wenzelm@23972
    99
    |> setmp_noncritical Proofterm.proofs level
wenzelm@24612
   100
    |> setmp_noncritical print_mode (modes @ print_mode_value ())
wenzelm@24061
   101
    |> setmp_noncritical Multithreading.trace trace_threads
wenzelm@23979
   102
    |> setmp_noncritical Multithreading.max_threads
wenzelm@23979
   103
      (if Multithreading.available then max_threads
wenzelm@23979
   104
       else (if max_threads = 1 then () else warning "Multithreading support unavailable"; 1))) ()
wenzelm@18683
   105
  handle exn => (Output.error_msg (Toplevel.exn_message exn); exit 1);
wenzelm@6346
   106
wenzelm@6346
   107
end;