src/Pure/PIDE/query_operation.ML
author wenzelm
Tue, 23 Jan 2018 19:25:39 +0100
changeset 67493 c4e9e0c50487
parent 62923 3a122e1e352a
child 76403 fb9c567a67cd
permissions -rw-r--r--
treat sessions as entities with defining position; tuned signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/PIDE/query_operation.ML
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     3
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     4
One-shot query operations via asynchronous print functions and temporary
57872
28e17057b545 tuned comments;
wenzelm
parents: 56333
diff changeset
     5
document overlays.
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     6
*)
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     7
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     8
signature QUERY_OPERATION =
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
     9
sig
60610
f52b4b0c10c4 improved scheduling for urgent tasks, using farm of replacement threads (may lead to factor 2 overloading, but CPUs are usually hyperthreaded);
wenzelm
parents: 57872
diff changeset
    10
  val register: {name: string, pri: int} ->
61223
dfccf6c06201 clarified markup;
wenzelm
parents: 61214
diff changeset
    11
    ({state: Toplevel.state, args: string list,
dfccf6c06201 clarified markup;
wenzelm
parents: 61214
diff changeset
    12
      output_result: string -> unit, writeln_result: string -> unit} -> unit) -> unit
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    13
end;
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    14
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    15
structure Query_Operation: QUERY_OPERATION =
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    16
struct
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    17
60610
f52b4b0c10c4 improved scheduling for urgent tasks, using farm of replacement threads (may lead to factor 2 overloading, but CPUs are usually hyperthreaded);
wenzelm
parents: 57872
diff changeset
    18
fun register {name, pri} f =
61206
d5aeb401111a more specific name to reduce danger of clash with direct uses of plain Command.print_function;
wenzelm
parents: 60610
diff changeset
    19
  Command.print_function (name ^ "_query")
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    20
    (fn {args = instance :: args, ...} =>
61208
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    21
      SOME {delay = NONE, pri = pri, persistent = false, strict = false,
62923
3a122e1e352a clarified bootstrap;
wenzelm
parents: 62891
diff changeset
    22
        print_fn = fn _ => Thread_Attributes.uninterruptible (fn restore_attributes => fn state =>
61208
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    23
          let
61223
dfccf6c06201 clarified markup;
wenzelm
parents: 61214
diff changeset
    24
            fun output_result s = Output.result [(Markup.instanceN, instance)] [s];
dfccf6c06201 clarified markup;
wenzelm
parents: 61214
diff changeset
    25
            fun status m = output_result (Markup.markup_only m);
dfccf6c06201 clarified markup;
wenzelm
parents: 61214
diff changeset
    26
            fun writeln_result s = output_result (Markup.markup Markup.writeln s);
dfccf6c06201 clarified markup;
wenzelm
parents: 61214
diff changeset
    27
            fun toplevel_error exn =
dfccf6c06201 clarified markup;
wenzelm
parents: 61214
diff changeset
    28
              output_result (Markup.markup Markup.error (Runtime.exn_message exn));
52876
78989972d5b8 more explicit status for query operation;
wenzelm
parents: 52865
diff changeset
    29
61208
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    30
            val _ = status Markup.running;
61223
dfccf6c06201 clarified markup;
wenzelm
parents: 61214
diff changeset
    31
            fun run () =
dfccf6c06201 clarified markup;
wenzelm
parents: 61214
diff changeset
    32
              f {state = state, args = args, output_result = output_result,
dfccf6c06201 clarified markup;
wenzelm
parents: 61214
diff changeset
    33
                  writeln_result = writeln_result};
61208
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    34
            val _ =
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    35
              (case Exn.capture (*sic!*) (restore_attributes run) () of
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    36
                Exn.Res () => ()
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    37
              | Exn.Exn exn => toplevel_error exn);
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    38
            val _ = status Markup.finished;
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    39
          in () end)}
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    40
    | _ => NONE);
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    41
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    42
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    43
(* print_state *)
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    44
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    45
val _ =
61214
a00bee2dfbd1 tuned priority (like other query operations, e.g. "find_theorems");
wenzelm
parents: 61209
diff changeset
    46
  register {name = "print_state", pri = Task_Queue.urgent_pri}
61208
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    47
    (fn {state = st, output_result, ...} =>
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    48
      if Toplevel.is_proof st
61209
7a421e7ef97c tuned signature;
wenzelm
parents: 61208
diff changeset
    49
      then output_result (Markup.markup Markup.state (Toplevel.string_of_state st))
61208
19118f9b939d separate panel for proof state output;
wenzelm
parents: 61206
diff changeset
    50
      else ());
52865
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    51
02a7e7180ee5 slightly more general support for one-shot query operations via asynchronous print functions and temporary document overlay;
wenzelm
parents:
diff changeset
    52
end;