Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | open MLton MLton.Signal |
2 | ||
3 | fun 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 | ||
28 | val _ = | |
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" |