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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
signature CRITICAL =
sig
val atomicBegin : unit -> unit
val atomicEnd : unit -> unit
val doAtomic : (unit -> unit) -> unit
end
structure Critical : CRITICAL =
struct
structure Thread = MLton.Thread
val atomicBegin = Thread.atomicBegin
val atomicEnd = Thread.atomicEnd
fun doAtomic f = (atomicBegin (); f (); atomicEnd ())
end
structure Main =
struct
structure Signal = MLton.Signal
structure Itimer = MLton.Itimer
val alrmHandler = fn t => t
fun setItimer t =
Itimer.set (Itimer.Real,
{value = t,
interval = t})
fun setAlrmHandler h =
Signal.setHandler (Itimer.signal Itimer.Real, h)
fun print s =
Critical.doAtomic (fn () => TextIO.print s)
fun doit n =
let
val () = setAlrmHandler (Signal.Handler.handler alrmHandler)
val () = setItimer (Time.fromMilliseconds 10)
fun loop i =
if i > n
then OS.Process.exit OS.Process.success
else let
val i' = (Int.toString i) ^ "\n"
fun loop' j =
if j > i then ()
else (print i'
; loop' (j + 1))
in
loop' 0
; loop (i + 1)
end
in
loop 0
end
end
val _ = Main.doit 500
|