/usr/share/doc/mlton/examples/timeout.sml is in mlton-doc 20100608-5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | open MLton MLton.Signal
fun timeLimit (t: Time.time, f: unit -> 'a): 'a option =
let
val which = Itimer.Real
val signal = Itimer.signal which
val res =
Thread.switch
(fn cur: 'a option Thread.t =>
let
val _ = setHandler (signal,
Handler.handler
(fn _ => Thread.prepare (cur, NONE)))
val _ =
Itimer.set (which, {value = t,
interval = Time.zeroTime})
val t = Thread.new (fn () =>
let val res = SOME (f ()) handle _ => NONE
in Thread.switch (fn _ => Thread.prepare (cur, res))
end)
in Thread.prepare (t, ())
end)
val _ = setHandler (signal, Handler.default)
in
res
end
val _ =
case timeLimit (Time.fromSeconds 10,
let fun loop () = loop ()
in loop
end) of
NONE => print "success\n"
| SOME _ => print "failure\n"
|