src/Pure/Concurrent/bash_sequential.ML
author wenzelm
Mon, 08 Aug 2011 13:40:24 +0200
changeset 44054 da5fcc0f6c52
parent 43850 7f2cbc713344
child 47499 4b0daca2bf88
permissions -rw-r--r--
proper signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
40748
591b6778d076 removed bash from ML system bootstrap, and past the Secure ML barrier;
wenzelm
parents: 39583
diff changeset
     1
(*  Title:      Pure/Concurrent/bash_sequential.ML
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
     3
35010
d6e492cea6e4 renamed system/system_out to bash/bash_output -- to emphasized that this is really GNU bash, not some undefined POSIX sh;
wenzelm
parents: 29564
diff changeset
     4
Generic GNU bash processes (no provisions to propagate interrupts, but
d6e492cea6e4 renamed system/system_out to bash/bash_output -- to emphasized that this is really GNU bash, not some undefined POSIX sh;
wenzelm
parents: 29564
diff changeset
     5
could work via the controlling tty).
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
     6
*)
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
     7
44054
da5fcc0f6c52 proper signature;
wenzelm
parents: 43850
diff changeset
     8
signature BASH =
da5fcc0f6c52 proper signature;
wenzelm
parents: 43850
diff changeset
     9
sig
da5fcc0f6c52 proper signature;
wenzelm
parents: 43850
diff changeset
    10
  val process: string -> {output: string, rc: int, terminate: unit -> unit}
da5fcc0f6c52 proper signature;
wenzelm
parents: 43850
diff changeset
    11
end;
da5fcc0f6c52 proper signature;
wenzelm
parents: 43850
diff changeset
    12
da5fcc0f6c52 proper signature;
wenzelm
parents: 43850
diff changeset
    13
structure Bash: BASH =
43850
7f2cbc713344 moved bash operations to Isabelle_System (cf. Scala version);
wenzelm
parents: 43847
diff changeset
    14
struct
7f2cbc713344 moved bash operations to Isabelle_System (cf. Scala version);
wenzelm
parents: 43847
diff changeset
    15
7f2cbc713344 moved bash operations to Isabelle_System (cf. Scala version);
wenzelm
parents: 43847
diff changeset
    16
fun process script =
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    17
  let
40749
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    18
    val id = serial_string ();
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    19
    val script_path = File.tmp_path (Path.basic ("bash_script" ^ id));
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    20
    val output_path = File.tmp_path (Path.basic ("bash_output" ^ id));
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    21
    fun cleanup () = (try File.rm script_path; try File.rm output_path);
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    22
  in
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    23
    let
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    24
      val _ = File.write script_path script;
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    25
      val status =
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    26
        OS.Process.system
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    27
          ("exec \"$ISABELLE_HOME/lib/scripts/process\" no_group /dev/null" ^
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    28
            " script \"exec bash " ^ File.shell_path script_path ^ " > " ^
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    29
            File.shell_path output_path ^ "\"");
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    30
      val rc =
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    31
        (case Posix.Process.fromStatus status of
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    32
          Posix.Process.W_EXITED => 0
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    33
        | Posix.Process.W_EXITSTATUS w => Word8.toInt w
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    34
        | Posix.Process.W_SIGNALED s => 256 + LargeWord.toInt (Posix.Signal.toWord s)
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    35
        | Posix.Process.W_STOPPED s => 512 + LargeWord.toInt (Posix.Signal.toWord s));
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    36
40749
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    37
      val output = the_default "" (try File.read output_path);
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    38
      val _ = cleanup ();
43847
529159f81d06 more general bash_process, which allows to terminate background processes as well;
wenzelm
parents: 40749
diff changeset
    39
    in {output = output, rc = rc, terminate = fn () => ()} end
40749
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    40
    handle exn => (cleanup (); reraise exn)
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    41
  end;
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    42
43850
7f2cbc713344 moved bash operations to Isabelle_System (cf. Scala version);
wenzelm
parents: 43847
diff changeset
    43
end;
7f2cbc713344 moved bash operations to Isabelle_System (cf. Scala version);
wenzelm
parents: 43847
diff changeset
    44