1 fun run (f
: unit
-> unit
) =
2 case Posix
.Process
.fork () of
6 val (pid
', status
) = waitpid (W_CHILD pid
, [])
7 in if pid
= pid
' andalso status
= W_EXITED
9 else raise Fail
"child failed"
11 | NONE
=> let open OS
.Process
12 in exit ((f (); success
) handle _
=> failure
)
20 open MLton
.World MLton
.Signal Posix
.Signal Posix
.Process Posix
.ProcEnv
22 val (w
, out
) = MLton
.TextIO.mkstemp
"/tmp/world"
23 val _
= TextIO.closeOut out
25 val childReady
= ref
false
27 fun print s
= TextIO.output (TextIO.stdErr
, s
)
29 val _
= setHandler (usr1
, Handler
.simple (fn () => childReady
:= true))
31 val parent
= getpid ()
37 val canExit
= ref
false
39 setHandler (usr1
, Handler
.handler (fn t
=> (canExit
:= true
42 ; kill (K_PROC parent
, usr1
)
44 fun loop () = if !canExit
then print
"success\n" else loop ()
54 fun loop () = if !childReady
then () else loop ()
57 ; kill (K_PROC child
, usr1
)
59 ; run (fn () => load w
)