Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / localhost / MLtonFinalizable
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5 <meta name="generator" content="AsciiDoc 8.6.9">
6 <title>MLtonFinalizable</title>
7 <link rel="stylesheet" href="./asciidoc.css" type="text/css">
8 <link rel="stylesheet" href="./pygments.css" type="text/css">
9
10
11 <script type="text/javascript" src="./asciidoc.js"></script>
12 <script type="text/javascript">
13 /*<![CDATA[*/
14 asciidoc.install();
15 /*]]>*/
16 </script>
17 <link rel="stylesheet" href="./mlton.css" type="text/css">
18 </head>
19 <body class="article">
20 <div id="banner">
21 <div id="banner-home">
22 <a href="./Home">MLton 20180207</a>
23 </div>
24 </div>
25 <div id="header">
26 <h1>MLtonFinalizable</h1>
27 </div>
28 <div id="content">
29 <div id="preamble">
30 <div class="sectionbody">
31 <div class="listingblock">
32 <div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">MLTON_FINALIZABLE</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
33 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
34 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
35
36 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">addFinalizer</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="w"></span>
37 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">finalizeBefore</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;b</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="w"></span>
38 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">new</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
39 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">touch</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="w"></span>
40 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">withValue</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;b</span><span class="w"></span>
41 <span class="w"> </span><span class="k">end</span><span class="w"></span>
42 </pre></div></div></div>
43 <div class="paragraph"><p>A <em>finalizable</em> value is a container to which finalizers can be
44 attached. A container holds a value, which is reachable as long as
45 the container itself is reachable. A <em>finalizer</em> is a function that
46 runs at some point after garbage collection determines that the
47 container to which it is attached has become
48 <a href="Reachability">unreachable</a>. A finalizer is treated like a signal
49 handler, in that it runs asynchronously in a separate thread, with
50 signals blocked, and will not interrupt a critical section (see
51 <a href="MLtonThread">MLtonThread</a>).</p></div>
52 <div class="ulist"><ul>
53 <li>
54 <p>
55 <span class="monospaced">addFinalizer (v, f)</span>
56 </p>
57 <div class="paragraph"><p>adds <span class="monospaced">f</span> as a finalizer to <span class="monospaced">v</span>. This means that sometime after the
58 last call to <span class="monospaced">withValue</span> on <span class="monospaced">v</span> completes and <span class="monospaced">v</span> becomes unreachable,
59 <span class="monospaced">f</span> will be called with the value of <span class="monospaced">v</span>.</p></div>
60 </li>
61 <li>
62 <p>
63 <span class="monospaced">finalizeBefore (v1, v2)</span>
64 </p>
65 <div class="paragraph"><p>ensures that <span class="monospaced">v1</span> will be finalized before <span class="monospaced">v2</span>. A cycle of values
66 <span class="monospaced">v</span> = <span class="monospaced">v1</span>, &#8230;, <span class="monospaced">vn</span> = <span class="monospaced">v</span> with <span class="monospaced">finalizeBefore (vi, vi+1)</span> will
67 result in none of the <span class="monospaced">vi</span> being finalized.</p></div>
68 </li>
69 <li>
70 <p>
71 <span class="monospaced">new x</span>
72 </p>
73 <div class="paragraph"><p>creates a new finalizable value, <span class="monospaced">v</span>, with value <span class="monospaced">x</span>. The finalizers
74 of <span class="monospaced">v</span> will run sometime after the last call to <span class="monospaced">withValue</span> on <span class="monospaced">v</span>
75 when the garbage collector determines that <span class="monospaced">v</span> is unreachable.</p></div>
76 </li>
77 <li>
78 <p>
79 <span class="monospaced">touch v</span>
80 </p>
81 <div class="paragraph"><p>ensures that <span class="monospaced">v</span>'s finalizers will not run before the call to <span class="monospaced">touch</span>.</p></div>
82 </li>
83 <li>
84 <p>
85 <span class="monospaced">withValue (v, f)</span>
86 </p>
87 <div class="paragraph"><p>returns the result of applying <span class="monospaced">f</span> to the value of <span class="monospaced">v</span> and ensures
88 that <span class="monospaced">v</span>'s finalizers will not run before <span class="monospaced">f</span> completes. The call to
89 <span class="monospaced">f</span> is a nontail call.</p></div>
90 </li>
91 </ul></div>
92 </div>
93 </div>
94 <div class="sect1">
95 <h2 id="_example">Example</h2>
96 <div class="sectionbody">
97 <div class="paragraph"><p>Suppose that <span class="monospaced">finalizable.sml</span> contains the following:</p></div>
98 <div class="listingblock">
99 <div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">CLIST</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
100 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
101 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
102
103 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">cons</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
104 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">sing</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">t</span><span class="w"></span>
105 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">sum</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
106 <span class="w"> </span><span class="k">end</span><span class="w"></span>
107
108 <span class="k">functor</span><span class="w"> </span><span class="n">CList</span><span class="w"> </span><span class="p">(</span><span class="k">structure</span><span class="w"> </span><span class="n">F</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_FINALIZABLE</span><span class="w"></span>
109 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">P</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_POINTER</span><span class="w"></span>
110 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Prim</span><span class="p">:</span><span class="w"></span>
111 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
112 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">cons</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">P</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">P</span><span class="p">.</span><span class="n">t</span><span class="w"></span>
113 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">free</span><span class="p">:</span><span class="w"> </span><span class="n">P</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="w"></span>
114 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">sing</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">P</span><span class="p">.</span><span class="n">t</span><span class="w"></span>
115 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">sum</span><span class="p">:</span><span class="w"> </span><span class="n">P</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">int</span><span class="w"></span>
116 <span class="w"> </span><span class="k">end</span><span class="p">):</span><span class="w"> </span><span class="n">CLIST</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
117 <span class="w"> </span><span class="k">struct</span><span class="w"></span>
118 <span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">P</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="n">F</span><span class="p">.</span><span class="n">t</span><span class="w"></span>
119
120 <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">cons</span><span class="w"> </span><span class="p">(</span><span class="n">n</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="p">,</span><span class="w"> </span><span class="n">l</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
121 <span class="w"> </span><span class="n">F</span><span class="p">.</span><span class="n">withValue</span><span class="w"></span>
122 <span class="w"> </span><span class="p">(</span><span class="n">l</span><span class="p">,</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">w&#39;</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>
123 <span class="w"> </span><span class="k">let</span><span class="w"></span>
124 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F</span><span class="p">.</span><span class="n">new</span><span class="w"> </span><span class="p">(</span><span class="n">Prim</span><span class="p">.</span><span class="n">cons</span><span class="w"> </span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="n">w&#39;</span><span class="p">))</span><span class="w"></span>
125 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F</span><span class="p">.</span><span class="n">addFinalizer</span><span class="w"> </span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="n">Prim</span><span class="p">.</span><span class="n">free</span><span class="p">)</span><span class="w"></span>
126 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F</span><span class="p">.</span><span class="n">finalizeBefore</span><span class="w"> </span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="n">l</span><span class="p">)</span><span class="w"></span>
127 <span class="w"> </span><span class="k">in</span><span class="w"></span>
128 <span class="w"> </span><span class="n">c</span><span class="w"></span>
129 <span class="w"> </span><span class="k">end</span><span class="p">)</span><span class="w"></span>
130
131 <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">sing</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
132 <span class="w"> </span><span class="k">let</span><span class="w"></span>
133 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F</span><span class="p">.</span><span class="n">new</span><span class="w"> </span><span class="p">(</span><span class="n">Prim</span><span class="p">.</span><span class="n">sing</span><span class="w"> </span><span class="n">n</span><span class="p">)</span><span class="w"></span>
134 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F</span><span class="p">.</span><span class="n">addFinalizer</span><span class="w"> </span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="n">Prim</span><span class="p">.</span><span class="n">free</span><span class="p">)</span><span class="w"></span>
135 <span class="w"> </span><span class="k">in</span><span class="w"></span>
136 <span class="w"> </span><span class="n">c</span><span class="w"></span>
137 <span class="w"> </span><span class="k">end</span><span class="w"></span>
138
139 <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F</span><span class="p">.</span><span class="n">withValue</span><span class="w"> </span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="n">Prim</span><span class="p">.</span><span class="n">sum</span><span class="p">)</span><span class="w"></span>
140 <span class="w"> </span><span class="k">end</span><span class="w"></span>
141
142 <span class="k">functor</span><span class="w"> </span><span class="n">Test</span><span class="w"> </span><span class="p">(</span><span class="k">structure</span><span class="w"> </span><span class="n">CList</span><span class="p">:</span><span class="w"> </span><span class="n">CLIST</span><span class="w"></span>
143 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">MLton</span><span class="p">:</span><span class="w"> </span><span class="k">sig</span><span class="w"></span>
144 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">GC</span><span class="p">:</span><span class="w"></span>
145 <span class="w"> </span><span class="k">sig</span><span class="w"></span>
146 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">collect</span><span class="p">:</span><span class="w"> </span><span class="n">unit</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="w"></span>
147 <span class="w"> </span><span class="k">end</span><span class="w"></span>
148 <span class="w"> </span><span class="k">end</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
149 <span class="w"> </span><span class="k">struct</span><span class="w"></span>
150 <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
151 <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">1</span><span class="w"></span>
152 <span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="p">()</span><span class="w"></span>
153 <span class="w"> </span><span class="k">else</span><span class="w"></span>
154 <span class="w"> </span><span class="k">let</span><span class="w"></span>
155 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Array</span><span class="p">.</span><span class="n">tabulate</span><span class="w"> </span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="w"></span>
156 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Array</span><span class="p">.</span><span class="n">sub</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="n">+</span><span class="w"> </span><span class="n">Array</span><span class="p">.</span><span class="n">sub</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"></span>
157 <span class="w"> </span><span class="k">in</span><span class="w"></span>
158 <span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">n</span><span class="w"> </span><span class="n">-</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"></span>
159 <span class="w"> </span><span class="k">end</span><span class="w"></span>
160
161 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">CList</span><span class="p">.</span><span class="n">sing</span><span class="w"> </span><span class="mi">2</span><span class="w"></span>
162 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">CList</span><span class="p">.</span><span class="n">cons</span><span class="w"> </span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">l</span><span class="p">)</span><span class="w"></span>
163 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">CList</span><span class="p">.</span><span class="n">cons</span><span class="w"> </span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">l</span><span class="p">)</span><span class="w"></span>
164 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">CList</span><span class="p">.</span><span class="n">cons</span><span class="w"> </span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">l</span><span class="p">)</span><span class="w"></span>
165 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">CList</span><span class="p">.</span><span class="n">cons</span><span class="w"> </span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">l</span><span class="p">)</span><span class="w"></span>
166 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">CList</span><span class="p">.</span><span class="n">cons</span><span class="w"> </span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">l</span><span class="p">)</span><span class="w"></span>
167 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">CList</span><span class="p">.</span><span class="n">cons</span><span class="w"> </span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">l</span><span class="p">)</span><span class="w"></span>
168 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">MLton</span><span class="p">.</span><span class="n">GC</span><span class="p">.</span><span class="n">collect</span><span class="w"> </span><span class="p">()</span><span class="w"></span>
169 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">100</span><span class="w"></span>
170 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="p">(</span><span class="n">concat</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;listSum(l) = &quot;</span><span class="p">,</span><span class="w"></span>
171 <span class="w"> </span><span class="n">Int</span><span class="p">.</span><span class="n">toString</span><span class="w"> </span><span class="p">(</span><span class="n">CList</span><span class="p">.</span><span class="n">sum</span><span class="w"> </span><span class="n">l</span><span class="p">),</span><span class="w"></span>
172 <span class="w"> </span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">])</span><span class="w"></span>
173 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">MLton</span><span class="p">.</span><span class="n">GC</span><span class="p">.</span><span class="n">collect</span><span class="w"> </span><span class="p">()</span><span class="w"></span>
174 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">100</span><span class="w"></span>
175 <span class="w"> </span><span class="k">end</span><span class="w"></span>
176
177 <span class="k">structure</span><span class="w"> </span><span class="n">CList</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
178 <span class="w"> </span><span class="n">CList</span><span class="w"> </span><span class="p">(</span><span class="k">structure</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">MLton</span><span class="p">.</span><span class="n">Finalizable</span><span class="w"></span>
179 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">MLton</span><span class="p">.</span><span class="n">Pointer</span><span class="w"></span>
180 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Prim</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
181 <span class="w"> </span><span class="k">struct</span><span class="w"></span>
182 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">cons</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">_</span><span class="n">import</span><span class="w"> </span><span class="s">&quot;listCons&quot;</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">P</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">P</span><span class="p">.</span><span class="n">t</span><span class="p">;</span><span class="w"></span>
183 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">free</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">_</span><span class="n">import</span><span class="w"> </span><span class="s">&quot;listFree&quot;</span><span class="p">:</span><span class="w"> </span><span class="n">P</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="p">;</span><span class="w"></span>
184 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">sing</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">_</span><span class="n">import</span><span class="w"> </span><span class="s">&quot;listSing&quot;</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">P</span><span class="p">.</span><span class="n">t</span><span class="p">;</span><span class="w"></span>
185 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">_</span><span class="n">import</span><span class="w"> </span><span class="s">&quot;listSum&quot;</span><span class="p">:</span><span class="w"> </span><span class="n">P</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">int</span><span class="p">;</span><span class="w"></span>
186 <span class="w"> </span><span class="k">end</span><span class="p">)</span><span class="w"></span>
187
188 <span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Test</span><span class="w"> </span><span class="p">(</span><span class="k">structure</span><span class="w"> </span><span class="n">CList</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">CList</span><span class="w"></span>
189 <span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">MLton</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">MLton</span><span class="p">)</span><span class="w"></span>
190 </pre></div></div></div>
191 <div class="paragraph"><p>Suppose that <span class="monospaced">cons.c</span> contains the following.</p></div>
192 <div class="listingblock">
193 <div class="content"><div class="highlight"><pre><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp"></span>
194
195 <span class="k">typedef</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">uint</span><span class="p">;</span>
196
197 <span class="k">typedef</span> <span class="k">struct</span> <span class="n">Cons</span> <span class="p">{</span>
198 <span class="k">struct</span> <span class="n">Cons</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
199 <span class="kt">int</span> <span class="n">value</span><span class="p">;</span>
200 <span class="p">}</span> <span class="o">*</span><span class="n">Cons</span><span class="p">;</span>
201
202 <span class="n">Cons</span> <span class="nf">listCons</span> <span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">Cons</span> <span class="n">c</span><span class="p">)</span> <span class="p">{</span>
203 <span class="n">Cons</span> <span class="n">res</span><span class="p">;</span>
204
205 <span class="n">res</span> <span class="o">=</span> <span class="p">(</span><span class="n">Cons</span><span class="p">)</span> <span class="n">malloc</span> <span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="o">*</span><span class="n">res</span><span class="p">));</span>
206 <span class="n">fprintf</span> <span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">&quot;0x%08x = listCons (%d)</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">uint</span><span class="p">)</span><span class="n">res</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
207 <span class="n">res</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">c</span><span class="p">;</span>
208 <span class="n">res</span><span class="o">-&gt;</span><span class="n">value</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
209 <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
210 <span class="p">}</span>
211
212 <span class="n">Cons</span> <span class="nf">listSing</span> <span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
213 <span class="n">Cons</span> <span class="n">res</span><span class="p">;</span>
214
215 <span class="n">res</span> <span class="o">=</span> <span class="p">(</span><span class="n">Cons</span><span class="p">)</span> <span class="n">malloc</span> <span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="o">*</span><span class="n">res</span><span class="p">));</span>
216 <span class="n">fprintf</span> <span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">&quot;0x%08x = listSing (%d)</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">uint</span><span class="p">)</span><span class="n">res</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
217 <span class="n">res</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
218 <span class="n">res</span><span class="o">-&gt;</span><span class="n">value</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
219 <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
220 <span class="p">}</span>
221
222 <span class="kt">void</span> <span class="nf">listFree</span> <span class="p">(</span><span class="n">Cons</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span>
223 <span class="n">fprintf</span> <span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">&quot;listFree (0x%08x)</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">uint</span><span class="p">)</span><span class="n">p</span><span class="p">);</span>
224 <span class="n">free</span> <span class="p">(</span><span class="n">p</span><span class="p">);</span>
225 <span class="p">}</span>
226
227 <span class="kt">int</span> <span class="nf">listSum</span> <span class="p">(</span><span class="n">Cons</span> <span class="n">c</span><span class="p">)</span> <span class="p">{</span>
228 <span class="kt">int</span> <span class="n">res</span><span class="p">;</span>
229
230 <span class="n">fprintf</span> <span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">&quot;listSum</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
231 <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
232 <span class="k">for</span> <span class="p">(;</span> <span class="n">c</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">;</span> <span class="n">c</span> <span class="o">=</span> <span class="n">c</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
233 <span class="n">res</span> <span class="o">+=</span> <span class="n">c</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">;</span>
234 <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
235 <span class="p">}</span>
236 </pre></div></div></div>
237 <div class="paragraph"><p>We can compile these to create an executable with</p></div>
238 <div class="listingblock">
239 <div class="content monospaced">
240 <pre>% mlton -default-ann 'allowFFI true' finalizable.sml cons.c</pre>
241 </div></div>
242 <div class="paragraph"><p>Running this executable will create output like the following.</p></div>
243 <div class="listingblock">
244 <div class="content monospaced">
245 <pre>% finalizable
246 0x08072890 = listSing (2)
247 0x080728a0 = listCons (2)
248 0x080728b0 = listCons (2)
249 0x080728c0 = listCons (2)
250 0x080728d0 = listCons (2)
251 0x080728e0 = listCons (2)
252 0x080728f0 = listCons (2)
253 listSum
254 listSum(l) = 14
255 listFree (0x080728f0)
256 listFree (0x080728e0)
257 listFree (0x080728d0)
258 listFree (0x080728c0)
259 listFree (0x080728b0)
260 listFree (0x080728a0)
261 listFree (0x08072890)</pre>
262 </div></div>
263 </div>
264 </div>
265 <div class="sect1">
266 <h2 id="_synchronous_finalizers">Synchronous Finalizers</h2>
267 <div class="sectionbody">
268 <div class="paragraph"><p>Finalizers in MLton are asynchronous. That is, they run at an
269 unspecified time, interrupting the user program. It is also possible,
270 and sometimes useful, to have synchronous finalizers, where the user
271 program explicitly decides when to run enabled finalizers. We have
272 considered this in MLton, and it seems possible, but there are some
273 unresolved design issues. See the thread at</p></div>
274 <div class="ulist"><ul>
275 <li>
276 <p>
277 <a href="http://www.mlton.org/pipermail/mlton/2004-September/016570.html">http://www.mlton.org/pipermail/mlton/2004-September/016570.html</a>
278 </p>
279 </li>
280 </ul></div>
281 </div>
282 </div>
283 <div class="sect1">
284 <h2 id="_also_see">Also see</h2>
285 <div class="sectionbody">
286 <div class="ulist"><ul>
287 <li>
288 <p>
289 <a href="References#Boehm03">Boehm03</a>
290 </p>
291 </li>
292 </ul></div>
293 </div>
294 </div>
295 </div>
296 <div id="footnotes"><hr></div>
297 <div id="footer">
298 <div id="footer-text">
299 </div>
300 <div id="footer-badges">
301 </div>
302 </div>
303 </body>
304 </html>