src/Pure/System/isabelle_process.ML
changeset 50505 33c92722cc3d
parent 50503 50f141b34bb7
child 50698 49621c755075
equal deleted inserted replaced
50504:2cc6eab90cdf 50505:33c92722cc3d
    15 
    15 
    16 signature ISABELLE_PROCESS =
    16 signature ISABELLE_PROCESS =
    17 sig
    17 sig
    18   val is_active: unit -> bool
    18   val is_active: unit -> bool
    19   val protocol_command: string -> (string list -> unit) -> unit
    19   val protocol_command: string -> (string list -> unit) -> unit
    20   val tracing_limit: int Unsynchronized.ref;
    20   val tracing_messages: int Unsynchronized.ref;
    21   val reset_tracing_limits: unit -> unit
    21   val reset_tracing: unit -> unit
    22   val crashes: exn list Synchronized.var
    22   val crashes: exn list Synchronized.var
    23   val init_fifos: string -> string -> unit
    23   val init_fifos: string -> string -> unit
    24   val init_socket: string -> unit
    24   val init_socket: string -> unit
    25 end;
    25 end;
    26 
    26 
    61           ML_Compiler.exn_message exn)));
    61           ML_Compiler.exn_message exn)));
    62 
    62 
    63 end;
    63 end;
    64 
    64 
    65 
    65 
    66 (* tracing limit *)
    66 (* restricted tracing messages *)
    67 
    67 
    68 val tracing_limit = Unsynchronized.ref 1000000;
    68 val tracing_messages = Unsynchronized.ref 100;
    69 
    69 
    70 val tracing_limits = Synchronized.var "tracing_limits" (Inttab.empty: int Inttab.table);
    70 val command_tracing_messages =
    71 
    71   Synchronized.var "command_tracing_messages" (Inttab.empty: int Inttab.table);
    72 fun reset_tracing_limits () = Synchronized.change tracing_limits (K Inttab.empty);
    72 
    73 
    73 fun reset_tracing () =
    74 fun update_tracing_limits msg =
    74   Synchronized.change command_tracing_messages (K Inttab.empty);
       
    75 
       
    76 fun update_tracing () =
    75   (case Position.get_id (Position.thread_data ()) of
    77   (case Position.get_id (Position.thread_data ()) of
    76     NONE => ()
    78     NONE => ()
    77   | SOME id =>
    79   | SOME id =>
    78       Synchronized.change tracing_limits (fn tab =>
    80       let
    79         let
    81         val i = Markup.parse_int id;
    80           val i = Markup.parse_int id;
    82         val (n, ok) =
    81           val n = the_default 0 (Inttab.lookup tab i) + size msg;
    83           Synchronized.change_result command_tracing_messages (fn tab =>
    82           val _ = if n > ! tracing_limit then raise Output.TRACING_LIMIT n else ();
    84             let
    83         in Inttab.update (i, n) tab end));
    85               val n = the_default 0 (Inttab.lookup tab i) + 1;
       
    86               val ok = n <= ! tracing_messages;
       
    87             in ((n, ok), Inttab.update (i, n) tab) end);
       
    88       in
       
    89         if ok then ()
       
    90         else
       
    91           let
       
    92             val (text, promise) = Active.dialog_text ();
       
    93             val _ =
       
    94               writeln ("Tracing paused.  " ^ text "Stop" ^ ", or continue with next " ^
       
    95                 text "10" ^ ", " ^ text "100" ^ ", " ^ text "1000" ^ " messages?")
       
    96             val m = Markup.parse_int (Future.join promise)
       
    97               handle Fail _ => error "Stopped";
       
    98           in
       
    99             Synchronized.change command_tracing_messages
       
   100               (Inttab.map_default (i, 0) (fn k => k - m))
       
   101           end
       
   102       end);
    84 
   103 
    85 
   104 
    86 (* message channels *)
   105 (* message channels *)
    87 
   106 
    88 local
   107 local
   129     Output.Private_Hooks.result_fn :=
   148     Output.Private_Hooks.result_fn :=
   130       (fn (i, s) => standard_message mbox (SOME i) Markup.resultN s);
   149       (fn (i, s) => standard_message mbox (SOME i) Markup.resultN s);
   131     Output.Private_Hooks.writeln_fn :=
   150     Output.Private_Hooks.writeln_fn :=
   132       (fn s => standard_message mbox (SOME (serial ())) Markup.writelnN s);
   151       (fn s => standard_message mbox (SOME (serial ())) Markup.writelnN s);
   133     Output.Private_Hooks.tracing_fn :=
   152     Output.Private_Hooks.tracing_fn :=
   134       (fn s => (update_tracing_limits s; standard_message mbox (SOME (serial ())) Markup.tracingN s));
   153       (fn s => (update_tracing (); standard_message mbox (SOME (serial ())) Markup.tracingN s));
   135     Output.Private_Hooks.warning_fn :=
   154     Output.Private_Hooks.warning_fn :=
   136       (fn s => standard_message mbox (SOME (serial ())) Markup.warningN s);
   155       (fn s => standard_message mbox (SOME (serial ())) Markup.warningN s);
   137     Output.Private_Hooks.error_fn :=
   156     Output.Private_Hooks.error_fn :=
   138       (fn (i, s) => standard_message mbox (SOME i) Markup.errorN s);
   157       (fn (i, s) => standard_message mbox (SOME i) Markup.errorN s);
   139     Output.Private_Hooks.protocol_message_fn := message true mbox Markup.protocolN;
   158     Output.Private_Hooks.protocol_message_fn := message true mbox Markup.protocolN;
   224         Multithreading.max_threads := Options.int options "threads";
   243         Multithreading.max_threads := Options.int options "threads";
   225         if Multithreading.max_threads_value () < 2
   244         if Multithreading.max_threads_value () < 2
   226         then Multithreading.max_threads := 2 else ();
   245         then Multithreading.max_threads := 2 else ();
   227         Goal.parallel_proofs := (if Options.int options "parallel_proofs" > 0 then 4 else 0);
   246         Goal.parallel_proofs := (if Options.int options "parallel_proofs" > 0 then 4 else 0);
   228         Goal.parallel_proofs_threshold := Options.int options "parallel_proofs_threshold";
   247         Goal.parallel_proofs_threshold := Options.int options "parallel_proofs_threshold";
   229         tracing_limit :=
   248         tracing_messages := Options.int options "editor_tracing_messages"
   230           Real.round (Options.real options "editor_tracing_limit_MB" * 1024.0 * 1024.0)
       
   231       end);
   249       end);
   232 
   250 
   233 end;
   251 end;
   234 
   252