src/Pure/Concurrent/bash_sequential.ML
author huffman
Mon, 20 Dec 2010 07:50:47 -0800
changeset 41320 4953e21ac76c
parent 40749 cb6698d2dbaf
child 43847 529159f81d06
permissions -rw-r--r--
replace list_map function with an abbreviation
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
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
     8
fun bash_output script =
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
     9
  let
40749
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    10
    val id = serial_string ();
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    11
    val script_path = File.tmp_path (Path.basic ("bash_script" ^ id));
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    12
    val output_path = File.tmp_path (Path.basic ("bash_output" ^ id));
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    13
    fun cleanup () = (try File.rm script_path; try File.rm output_path);
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    14
  in
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    15
    let
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    16
      val _ = File.write script_path script;
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    17
      val status =
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    18
        OS.Process.system
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    19
          ("exec \"$ISABELLE_HOME/lib/scripts/process\" no_group /dev/null" ^
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    20
            " script \"exec bash " ^ File.shell_path script_path ^ " > " ^
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    21
            File.shell_path output_path ^ "\"");
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    22
      val rc =
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    23
        (case Posix.Process.fromStatus status of
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    24
          Posix.Process.W_EXITED => 0
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    25
        | Posix.Process.W_EXITSTATUS w => Word8.toInt w
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    26
        | Posix.Process.W_SIGNALED s => 256 + LargeWord.toInt (Posix.Signal.toWord s)
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    27
        | Posix.Process.W_STOPPED s => 512 + LargeWord.toInt (Posix.Signal.toWord s));
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    28
40749
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    29
      val output = the_default "" (try File.read output_path);
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    30
      val _ = cleanup ();
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    31
    in (output, rc) end
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    32
    handle exn => (cleanup (); reraise exn)
cb6698d2dbaf prefer Isabelle/ML concurrency elements;
wenzelm
parents: 40748
diff changeset
    33
  end;
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    34