Import Upstream version 20180207
[hcoop/debian/mlton.git] / basis-library / system / process.sml
CommitLineData
7f918cf1
CE
1(* Modified from SML/NJ sources by Stephen Weeks 1998-06-25 *)
2(* modified by Stephen Weeks 1999-12-10 *)
3(* modified by Stephen Weeks 2000-01-18 *)
4(* modified by Matthew Fluet 2008-03-02 *)
5(* modified by Matthew Fluet 2008-04-06 *)
6
7(* os-process.sml
8 *
9 * COPYRIGHT (c) 1995 AT&T Bell Laboratories.
10 *
11 * The Posix-based implementation of the generic process control
12 * interface (OS.Process).
13 *
14 *)
15
16structure OS_Process: OS_PROCESS_EXTRA =
17 struct
18 open Posix.Process
19
20 structure Status =
21 struct
22 open MLtonProcess.Status
23
24 fun equals (s1, s2) =
25 (toRep s1) = (toRep s2)
26
27 val fromPosix =
28 fn es =>
29 let
30 datatype z = datatype Posix.Process.exit_status
31 in
32 case es of
33 W_EXITED => success
34 | W_EXITSTATUS w =>
35 fromRep (C_Status.castFromSysWord (Word8.castToSysWord w))
36 | W_SIGNALED _ => failure
37 | W_STOPPED _ => failure
38 end
39 end
40
41 type status = Status.t
42
43 val failure = Status.failure
44 val success = Status.success
45 fun isSuccess st = Status.equals (st, success)
46
47 fun system cmd =
48 (Status.fromRep o Posix.Error.SysCall.simpleResult)
49 (fn () =>
50 PrimitiveFFI.Posix.Process.system (NullString.nullTerm cmd))
51
52 val atExit = MLtonProcess.atExit
53
54 val exit = MLtonProcess.exit
55
56 fun terminate x = Posix.Process.exit (Word8.fromInt (Status.toInt x))
57
58 val getEnv = Posix.ProcEnv.getenv
59
60 fun sleep t =
61 if Time.<= (t, Time.zeroTime)
62 then ()
63 else sleep (Posix.Process.sleep t)
64 end