Backport from sid to buster
[hcoop/debian/mlton.git] / regression / timeout.sml
CommitLineData
7f918cf1
CE
1open MLton MLton.Signal
2
3fun timeLimit (t: Time.time, f: unit -> 'a): 'a option =
4 let
5 val which = Itimer.Real
6 val signal = Itimer.signal which
7 val res =
8 Thread.switch
9 (fn cur: 'a option Thread.t =>
10 let
11 val _ = setHandler (signal,
12 Handler.handler
13 (fn _ => Thread.prepare (cur, NONE)))
14 val _ =
15 Itimer.set (which, {value = t,
16 interval = Time.zeroTime})
17 val t = Thread.new (fn () =>
18 let val res = SOME (f ()) handle _ => NONE
19 in Thread.switch (fn _ => Thread.prepare (cur, res))
20 end)
21 in Thread.prepare (t, ())
22 end)
23 val _ = setHandler (signal, Handler.default)
24 in
25 res
26 end
27
28val _ =
29 case timeLimit (Time.fromSeconds 10,
30 let fun loop () = loop ()
31 in loop
32 end) of
33 NONE => print "success\n"
34 | SOME _ => print "failure\n"