File: signals2.sml

package info (click to toggle)
mlton 20210117%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 58,464 kB
  • sloc: ansic: 27,682; sh: 4,455; asm: 3,569; lisp: 2,879; makefile: 2,347; perl: 1,169; python: 191; pascal: 68; javascript: 7
file content (55 lines) | stat: -rw-r--r-- 1,561 bytes parent folder | download | duplicates (7)
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