File: thread-switch-share.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 (39 lines) | stat: -rw-r--r-- 1,014 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
(* Access the current stack in the heap via a MLton.share object trace. *)
val rt : MLton.Thread.Runnable.t option ref = ref NONE

fun stats () =
   let
      val () = MLton.share rt
   in
      ()
   end

fun switcheroo () =
   MLton.Thread.switch
   (fn t => let
               val () = rt := SOME (MLton.Thread.prepare (t, ()))
               val () = stats ()
            in
               valOf (!rt)
            end)

(* tuple option array *)
val a = Array.tabulate (100, fn i => SOME (i mod 2, i mod 3))
val () = Array.update (a, 0, NONE)

fun touch () =
   let
      val size = MLton.size a
      val sum =
         Array.foldr (fn (NONE,sum) => sum
                       | (SOME (a, b),sum) => a + b + sum)
                     0 a
   in
      (size, sum)
   end

val (size1,sum1) = touch ()
val () = switcheroo ()
val (size2,sum2) = touch ()
val _ = print (concat ["size1 >= size2 = ", Bool.toString (size1 >= size2), "\n"])
val _ = print (concat ["sum1 = sum2 = ", Bool.toString (sum1 >= sum2), "\n"])