src/Pure/System/invoke_scala.ML
author wenzelm
Wed, 02 Jan 2013 13:20:10 +0100
changeset 50682 a0888c03a727
parent 50201 c26369c9eda6
child 52111 1fd184eaa310
permissions -rw-r--r--
removed outdated comment;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43748
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/System/invoke_scala.ML
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
     3
49173
fa01a202399c eliminated potentially confusing terminology of Scala "layer";
wenzelm
parents: 46774
diff changeset
     4
JVM method invocation service via Isabelle/Scala.
43748
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
     5
*)
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
     6
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
     7
signature INVOKE_SCALA =
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
     8
sig
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
     9
  exception Null
43749
5ca34f21cb44 tuned signature;
wenzelm
parents: 43748
diff changeset
    10
  val method: string -> string -> string
5ca34f21cb44 tuned signature;
wenzelm
parents: 43748
diff changeset
    11
  val promise_method: string -> string -> string future
43748
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    12
  val fulfill_method: string -> string -> string -> unit
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    13
end;
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    14
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    15
structure Invoke_Scala: INVOKE_SCALA =
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    16
struct
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    17
43749
5ca34f21cb44 tuned signature;
wenzelm
parents: 43748
diff changeset
    18
exception Null;
5ca34f21cb44 tuned signature;
wenzelm
parents: 43748
diff changeset
    19
5ca34f21cb44 tuned signature;
wenzelm
parents: 43748
diff changeset
    20
43748
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    21
(* pending promises *)
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    22
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    23
val new_id = string_of_int o Synchronized.counter ();
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    24
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    25
val promises =
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    26
  Synchronized.var "Invoke_Scala.promises" (Symtab.empty: string future Symtab.table);
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    27
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    28
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    29
(* method invocation *)
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    30
43749
5ca34f21cb44 tuned signature;
wenzelm
parents: 43748
diff changeset
    31
fun promise_method name arg =
43748
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    32
  let
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    33
    val id = new_id ();
50201
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49470
diff changeset
    34
    fun abort () = Output.protocol_message (Markup.cancel_scala id) "";
44298
b8f8488704e2 Future.promise: explicit abort operation (like uninterruptible future job);
wenzelm
parents: 43761
diff changeset
    35
    val promise = Future.promise abort : string future;
43748
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    36
    val _ = Synchronized.change promises (Symtab.update (id, promise));
50201
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49470
diff changeset
    37
    val _ = Output.protocol_message (Markup.invoke_scala name id) arg;
43748
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    38
  in promise end;
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    39
43749
5ca34f21cb44 tuned signature;
wenzelm
parents: 43748
diff changeset
    40
fun method name arg = Future.join (promise_method name arg);
5ca34f21cb44 tuned signature;
wenzelm
parents: 43748
diff changeset
    41
43748
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    42
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    43
(* fulfill method *)
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    44
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    45
fun fulfill_method id tag res =
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    46
  let
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    47
    val result =
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    48
      (case tag of
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    49
        "0" => Exn.Exn Null
43761
e72ba84ae58f tuned signature -- corresponding to Scala version;
wenzelm
parents: 43749
diff changeset
    50
      | "1" => Exn.Res res
43748
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    51
      | "2" => Exn.Exn (ERROR res)
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    52
      | "3" => Exn.Exn (Fail res)
49470
ee564db2649b more management of Invoke_Scala tasks;
wenzelm
parents: 49173
diff changeset
    53
      | "4" => Exn.Exn Exn.Interrupt
43748
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    54
      | _ => raise Fail "Bad tag");
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    55
    val promise =
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    56
      Synchronized.change_result promises
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    57
        (fn tab => (the (Symtab.lookup tab id), Symtab.delete id tab));
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    58
    val _ = Future.fulfill_result promise result;
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    59
  in () end;
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    60
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    61
end;
c70bd78ec83c JVM method invocation service via Scala layer;
wenzelm
parents:
diff changeset
    62