src/HOL/Tools/ATP/modUnix.ML
author paulson
Thu, 28 Apr 2005 17:56:58 +0200
changeset 15872 8336ff711d80
parent 15789 4cb16144c81b
child 16039 dfe264950511
permissions -rw-r--r--
fixed treatment of higher-order simprules
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15789
4cb16144c81b added hearder lines and deleted some redundant material
paulson
parents: 15782
diff changeset
     1
(*  ID:         $Id$
4cb16144c81b added hearder lines and deleted some redundant material
paulson
parents: 15782
diff changeset
     2
    Author:     Claire Quigley
4cb16144c81b added hearder lines and deleted some redundant material
paulson
parents: 15782
diff changeset
     3
    Copyright   2004  University of Cambridge
4cb16144c81b added hearder lines and deleted some redundant material
paulson
parents: 15782
diff changeset
     4
*)
15642
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     5
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     6
(****************************************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     7
(****** Slightly modified version of sml Unix structure *********)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     8
(****************************************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
     9
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    10
type signal = Posix.Signal.signal
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    11
datatype exit_status = datatype Posix.Process.exit_status
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    12
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    13
val fromStatus = Posix.Process.fromStatus
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    14
15782
a1863ea9052b Corrected the problem with the ATP directory.
quigley
parents: 15700
diff changeset
    15
15700
970e0293dfb3 tweaks mainly to achieve sml/nj compatibility
paulson
parents: 15642
diff changeset
    16
fun reap(pid, instr, outstr) =
15782
a1863ea9052b Corrected the problem with the ATP directory.
quigley
parents: 15700
diff changeset
    17
        let
15642
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    18
		val u = TextIO.closeIn instr;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    19
	        val u = TextIO.closeOut outstr;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    20
	
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    21
		val (_, status) =
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    22
			Posix.Process.waitpid(Posix.Process.W_CHILD pid, [])
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    23
	in
15700
970e0293dfb3 tweaks mainly to achieve sml/nj compatibility
paulson
parents: 15642
diff changeset
    24
		status
15642
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    25
	end
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    26
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    27
fun fdReader (name : string, fd : Posix.IO.file_desc) =
15789
4cb16144c81b added hearder lines and deleted some redundant material
paulson
parents: 15782
diff changeset
    28
	  Posix.IO.mkTextReader {initBlkMode = true,name = name,fd = fd };
15642
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    29
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    30
fun fdWriter (name, fd) =
15789
4cb16144c81b added hearder lines and deleted some redundant material
paulson
parents: 15782
diff changeset
    31
          Posix.IO.mkTextWriter {
15642
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    32
	      appendMode = false,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    33
              initBlkMode = true,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    34
              name = name,  
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    35
              chunkSize=4096,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    36
              fd = fd
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    37
            };
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    38
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    39
fun openOutFD (name, fd) =
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    40
	  TextIO.mkOutstream (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    41
	    TextIO.StreamIO.mkOutstream (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    42
	      fdWriter (name, fd), IO.BLOCK_BUF));
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    43
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    44
fun openInFD (name, fd) =
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    45
	  TextIO.mkInstream (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    46
	    TextIO.StreamIO.mkInstream (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    47
	      fdReader (name, fd), ""));
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    48
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    49
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    50
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    51
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    52
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    53
(*****************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    54
(*  The result of calling createWatcher  *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    55
(*****************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    56
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    57
datatype proc = PROC of {
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    58
        pid : Posix.Process.pid,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    59
        instr : TextIO.instream,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    60
        outstr : TextIO.outstream
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    61
      };
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    62
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    63
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    64
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    65
(*****************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    66
(*  The result of calling executeToList  *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    67
(*****************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    68
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    69
datatype cmdproc = CMDPROC of {
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    70
        prover: string,             (* Name of the resolution prover used, e.g. Vampire, SPASS *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    71
        cmd:  string,              (* The file containing the goal for res prover to prove *)     
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    72
        thmstring: string,         (* string representation of subgoal after negation, skolemization*) 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    73
        goalstring: string,         (* string representation of subgoal*) 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    74
        pid : Posix.Process.pid,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    75
        instr : TextIO.instream,   (*  Input stream to child process *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    76
        outstr : TextIO.outstream  (*  Output stream from child process *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    77
      };
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    78
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    79
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    80
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    81
fun killChild pid = Posix.Process.kill(Posix.Process.K_PROC pid, Posix.Signal.kill);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    82
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    83
fun childInfo (PROC{pid,instr,outstr}) = ((pid, (instr,outstr)));
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    84
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    85
fun cmdstreamsOf (CMDPROC{instr,outstr,...}) = (instr, outstr);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    86
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    87
fun cmdInStream (CMDPROC{instr,outstr,...}) = (instr);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    88
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    89
fun cmdchildInfo (CMDPROC{prover,cmd,thmstring,goalstring,pid,instr,outstr}) = (prover,(cmd,(pid, (instr,outstr))));
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    90
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    91
fun cmdchildPid (CMDPROC{prover,cmd,thmstring,goalstring,pid,instr,outstr})  = (pid);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    92
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    93
fun cmdProver (CMDPROC{prover,cmd,thmstring,goalstring,pid,instr,outstr})  = (prover);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    94
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    95
fun cmdThm (CMDPROC{prover,cmd,thmstring,goalstring,pid,instr,outstr})  = (thmstring);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    96
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    97
fun cmdGoal (CMDPROC{prover,cmd,thmstring,goalstring,pid,instr,outstr})  = (goalstring);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    98
(***************************************************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
    99
(*  Takes a command - e.g. 'vampire', a list of arguments for the command, *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   100
(*  and a list of currently running processes.  Creates a new process for  *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   101
(*  cmd and argv and adds it to procList                                   *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   102
(***************************************************************************)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   103
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   104
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   105
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   106
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   107
fun mySshExecuteToList (cmd, argv, procList) = let
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   108
          val p1 = Posix.IO.pipe ()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   109
          val p2 = Posix.IO.pipe ()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   110
          val prover = hd argv
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   111
          val thmstring = hd(tl argv)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   112
          val goalstring = hd(tl(tl argv))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   113
          val argv = tl (tl argv)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   114
          
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   115
          (* Turn the arguments into a single string.  Perhaps we should quote the
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   116
                   arguments.  *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   117
                fun convArgs [] = []
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   118
                  | convArgs [s] = [s]
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   119
                  | convArgs (hd::tl) = hd :: " " :: convArgs tl
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   120
                val cmd_args = concat(convArgs(cmd :: argv))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   121
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   122
	  fun closep () = (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   123
                Posix.IO.close (#outfd p1); 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   124
                Posix.IO.close (#infd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   125
                Posix.IO.close (#outfd p2); 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   126
                Posix.IO.close (#infd p2)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   127
              )
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   128
          fun startChild () =(case  Posix.Process.fork()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   129
		 of SOME pid =>  pid           (* parent *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   130
                  | NONE => let                 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   131
		      val oldchildin = #infd p1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   132
		      val newchildin = Posix.FileSys.wordToFD 0w0
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   133
		      val oldchildout = #outfd p2
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   134
		      val newchildout = Posix.FileSys.wordToFD 0w1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   135
                      (*val args = (["shep"]@([cmd]@argv))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   136
                      val newcmd = "/usr/bin/ssh"*)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   137
                      
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   138
                      in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   139
			Posix.IO.close (#outfd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   140
			Posix.IO.close (#infd p2);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   141
			Posix.IO.dup2{old = oldchildin, new = newchildin};
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   142
                        Posix.IO.close oldchildin;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   143
			Posix.IO.dup2{old = oldchildout, new = newchildout};
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   144
                        Posix.IO.close oldchildout;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   145
                       (* Run the command. *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   146
                       (* Run this as a shell command.  The command and arguments have
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   147
                          to be a single argument. *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   148
                       Posix.Process.exec("/bin/sh", ["sh", "-c", cmd_args])
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   149
			(*Posix.Process.exec(newcmd, args)*)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   150
		      end
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   151
		(* end case *))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   152
          val _ = TextIO.flushOut TextIO.stdOut
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   153
          val pid = (startChild ()) handle ex => (closep(); raise ex)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   154
	  val instr = openInFD ("_exec_in", #infd p2)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   155
          val outstr = openOutFD ("_exec_out", #outfd p1)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   156
          val cmd = hd (rev argv)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   157
          in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   158
              (* close the child-side fds *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   159
            Posix.IO.close (#outfd p2);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   160
            Posix.IO.close (#infd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   161
              (* set the fds close on exec *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   162
            Posix.IO.setfd (#infd p2, Posix.IO.FD.flags [Posix.IO.FD.cloexec]);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   163
            Posix.IO.setfd (#outfd p1, Posix.IO.FD.flags [Posix.IO.FD.cloexec]);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   164
            (((CMDPROC{
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   165
              prover = prover,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   166
              cmd = cmd,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   167
              thmstring = thmstring,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   168
              goalstring = goalstring,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   169
              pid = pid,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   170
              instr = instr,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   171
              outstr = outstr
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   172
            })::procList))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   173
          end;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   174
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   175
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   176
fun myexecuteInEnv (cmd, argv, env) = let
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   177
          val p1 = Posix.IO.pipe ()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   178
          val p2 = Posix.IO.pipe ()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   179
          fun closep () = (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   180
                Posix.IO.close (#outfd p1); 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   181
                Posix.IO.close (#infd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   182
                Posix.IO.close (#outfd p2); 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   183
                Posix.IO.close (#infd p2)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   184
              )
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   185
          fun startChild () =(case  Posix.Process.fork()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   186
                 of SOME pid =>  pid           (* parent *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   187
                  | NONE => let
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   188
                      val oldchildin = #infd p1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   189
                      val newchildin = Posix.FileSys.wordToFD 0w0
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   190
                      val oldchildout = #outfd p2
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   191
                      val newchildout = Posix.FileSys.wordToFD 0w1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   192
                      in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   193
                        Posix.IO.close (#outfd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   194
                        Posix.IO.close (#infd p2);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   195
                        Posix.IO.dup2{old = oldchildin, new = newchildin};
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   196
                        Posix.IO.close oldchildin;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   197
                        Posix.IO.dup2{old = oldchildout, new = newchildout};
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   198
                        Posix.IO.close oldchildout;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   199
                        Posix.Process.exece(cmd, argv, env)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   200
                      end
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   201
                (* end case *))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   202
          val _ = TextIO.flushOut TextIO.stdOut
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   203
          val pid = (startChild ()) handle ex => (closep(); raise ex)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   204
          val instr = openInFD ("_exec_in", #infd p2)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   205
          val outstr = openOutFD ("_exec_out", #outfd p1)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   206
          in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   207
              (* close the child-side fds *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   208
            Posix.IO.close (#outfd p2);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   209
            Posix.IO.close (#infd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   210
              (* set the fds close on exec *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   211
            Posix.IO.setfd (#infd p2, Posix.IO.FD.flags [Posix.IO.FD.cloexec]);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   212
            Posix.IO.setfd (#outfd p1, Posix.IO.FD.flags [Posix.IO.FD.cloexec]);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   213
            PROC{pid = pid,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   214
              instr = instr,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   215
              outstr = outstr
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   216
            }
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   217
          end;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   218
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   219
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   220
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   221
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   222
fun myexecuteToList (cmd, argv, procList) = let
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   223
          val p1 = Posix.IO.pipe ()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   224
          val p2 = Posix.IO.pipe ()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   225
          val prover = hd argv
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   226
          val thmstring = hd(tl argv)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   227
          val goalstring = hd(tl(tl argv))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   228
          val argv = tl (tl (tl(argv)))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   229
          
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   230
	  fun closep () = (
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   231
                Posix.IO.close (#outfd p1); 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   232
                Posix.IO.close (#infd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   233
                Posix.IO.close (#outfd p2); 
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   234
                Posix.IO.close (#infd p2)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   235
              )
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   236
          fun startChild () =(case  Posix.Process.fork()
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   237
		 of SOME pid =>  pid           (* parent *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   238
                  | NONE => let
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   239
		      val oldchildin = #infd p1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   240
		      val newchildin = Posix.FileSys.wordToFD 0w0
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   241
		      val oldchildout = #outfd p2
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   242
		      val newchildout = Posix.FileSys.wordToFD 0w1
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   243
                      in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   244
			Posix.IO.close (#outfd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   245
			Posix.IO.close (#infd p2);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   246
			Posix.IO.dup2{old = oldchildin, new = newchildin};
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   247
                        Posix.IO.close oldchildin;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   248
			Posix.IO.dup2{old = oldchildout, new = newchildout};
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   249
                        Posix.IO.close oldchildout;
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   250
			Posix.Process.exec(cmd, argv)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   251
		      end
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   252
		(* end case *))
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   253
          val _ = TextIO.flushOut TextIO.stdOut
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   254
          val pid = (startChild ()) handle ex => (closep(); raise ex)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   255
	  val instr = openInFD ("_exec_in", #infd p2)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   256
          val outstr = openOutFD ("_exec_out", #outfd p1)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   257
          val cmd = hd (rev argv)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   258
          in
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   259
              (* close the child-side fds *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   260
            Posix.IO.close (#outfd p2);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   261
            Posix.IO.close (#infd p1);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   262
              (* set the fds close on exec *)
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   263
            Posix.IO.setfd (#infd p2, Posix.IO.FD.flags [Posix.IO.FD.cloexec]);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   264
            Posix.IO.setfd (#outfd p1, Posix.IO.FD.flags [Posix.IO.FD.cloexec]);
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   265
            (((CMDPROC{
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   266
              prover = prover,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   267
              cmd = cmd,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   268
              thmstring = thmstring,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   269
              goalstring = goalstring,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   270
              pid = pid,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   271
              instr = instr,
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   272
              outstr = outstr
028059faa963 *** empty log message ***
quigley
parents:
diff changeset
   273
            })::procList))
15700
970e0293dfb3 tweaks mainly to achieve sml/nj compatibility
paulson
parents: 15642
diff changeset
   274
          end;