Import Debian changes 20180207-1
[hcoop/debian/mlton.git] / doc / guide / localhost / MLtonThread
CommitLineData
7f918cf1
CE
1<!DOCTYPE html>\r
2<html lang="en">\r
3<head>\r
4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\r
5<meta name="generator" content="AsciiDoc 8.6.9">\r
6<title>MLtonThread</title>\r
7<link rel="stylesheet" href="./asciidoc.css" type="text/css">\r
8<link rel="stylesheet" href="./pygments.css" type="text/css">\r
9\r
10\r
11<script type="text/javascript" src="./asciidoc.js"></script>\r
12<script type="text/javascript">\r
13/*<![CDATA[*/\r
14asciidoc.install();\r
15/*]]>*/\r
16</script>\r
17<link rel="stylesheet" href="./mlton.css" type="text/css">\r
18</head>\r
19<body class="article">\r
20<div id="banner">\r
21<div id="banner-home">\r
22<a href="./Home">MLton 20180207</a>\r
23</div>\r
24</div>\r
25<div id="header">\r
26<h1>MLtonThread</h1>\r
27</div>\r
28<div id="content">\r
29<div id="preamble">\r
30<div class="sectionbody">\r
31<div class="listingblock">\r
32<div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">MLTON_THREAD</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
33<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
34<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">AtomicState</span><span class="p">:</span><span class="w"></span>\r
35<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
36<span class="w"> </span><span class="k">datatype</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">NonAtomic</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">Atomic</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">int</span><span class="w"></span>\r
37<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
38\r
39<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">atomically</span><span class="p">:</span><span class="w"> </span><span class="p">(</span><span class="n">unit</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;a</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"></span>\r
40<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">atomicBegin</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>\r
41<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">atomicEnd</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>\r
42<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">atomicState</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">AtomicState</span><span class="p">.</span><span class="n">t</span><span class="w"></span>\r
43\r
44<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Runnable</span><span class="p">:</span><span class="w"></span>\r
45<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
46<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
47<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
48\r
49<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>\r
50\r
51<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">atomicSwitch</span><span class="p">:</span><span class="w"> </span><span class="p">(</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">Runnable</span><span class="p">.</span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"></span>\r
52<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="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">&#39;a</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
53<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">prepend</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;b</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;a</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><span class="n">t</span><span class="w"></span>\r
54<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">prepare</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;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">Runnable</span><span class="p">.</span><span class="n">t</span><span class="w"></span>\r
55<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">switch</span><span class="p">:</span><span class="w"> </span><span class="p">(</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">Runnable</span><span class="p">.</span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"></span>\r
56<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
57</pre></div></div></div>\r
58<div class="paragraph"><p><span class="monospaced">MLton.Thread</span> provides access to MLton&#8217;s user-level thread\r
59implementation (i.e. not OS-level threads). Threads are lightweight\r
60data structures that represent a paused computation. Runnable threads\r
61are threads that will begin or continue computing when <span class="monospaced">switch</span>-ed to.\r
62<span class="monospaced">MLton.Thread</span> does not include a default scheduling mechanism, but it\r
63can be used to implement both preemptive and non-preemptive threads.</p></div>\r
64<div class="ulist"><ul>\r
65<li>\r
66<p>\r
67<span class="monospaced">type AtomicState.t</span>\r
68</p>\r
69<div class="paragraph"><p>the type of atomic states.</p></div>\r
70</li>\r
71<li>\r
72<p>\r
73<span class="monospaced">atomically f</span>\r
74</p>\r
75<div class="paragraph"><p>runs <span class="monospaced">f</span> in a critical section.</p></div>\r
76</li>\r
77<li>\r
78<p>\r
79<span class="monospaced">atomicBegin ()</span>\r
80</p>\r
81<div class="paragraph"><p>begins a critical section.</p></div>\r
82</li>\r
83<li>\r
84<p>\r
85<span class="monospaced">atomicEnd ()</span>\r
86</p>\r
87<div class="paragraph"><p>ends a critical section.</p></div>\r
88</li>\r
89<li>\r
90<p>\r
91<span class="monospaced">atomicState ()</span>\r
92</p>\r
93<div class="paragraph"><p>returns the current atomic state.</p></div>\r
94</li>\r
95<li>\r
96<p>\r
97<span class="monospaced">type Runnable.t</span>\r
98</p>\r
99<div class="paragraph"><p>the type of threads that can be resumed.</p></div>\r
100</li>\r
101<li>\r
102<p>\r
103<span class="monospaced">type 'a t</span>\r
104</p>\r
105<div class="paragraph"><p>the type of threads that expect a value of type <span class="monospaced">'a</span>.</p></div>\r
106</li>\r
107<li>\r
108<p>\r
109<span class="monospaced">atomicSwitch f</span>\r
110</p>\r
111<div class="paragraph"><p>like <span class="monospaced">switch</span>, but assumes an atomic calling context. Upon\r
112<span class="monospaced">switch</span>-ing back to the current thread, an implicit <span class="monospaced">atomicEnd</span> is\r
113performed.</p></div>\r
114</li>\r
115<li>\r
116<p>\r
117<span class="monospaced">new f</span>\r
118</p>\r
119<div class="paragraph"><p>creates a new thread that, when run, applies <span class="monospaced">f</span> to the value given to\r
120the thread. <span class="monospaced">f</span> must terminate by `switch`ing to another thread or\r
121exiting the process.</p></div>\r
122</li>\r
123<li>\r
124<p>\r
125<span class="monospaced">prepend (t, f)</span>\r
126</p>\r
127<div class="paragraph"><p>creates a new thread (destroying <span class="monospaced">t</span> in the process) that first\r
128applies <span class="monospaced">f</span> to the value given to the thread and then continues with\r
129<span class="monospaced">t</span>. This is a constant time operation.</p></div>\r
130</li>\r
131<li>\r
132<p>\r
133<span class="monospaced">prepare (t, v)</span>\r
134</p>\r
135<div class="paragraph"><p>prepares a new runnable thread (destroying <span class="monospaced">t</span> in the process) that\r
136will evaluate <span class="monospaced">t</span> on <span class="monospaced">v</span>.</p></div>\r
137</li>\r
138<li>\r
139<p>\r
140<span class="monospaced">switch f</span>\r
141</p>\r
142<div class="paragraph"><p>applies <span class="monospaced">f</span> to the current thread to get <span class="monospaced">rt</span>, and then start running\r
143thread <span class="monospaced">rt</span>. It is an error for <span class="monospaced">f</span> to perform another <span class="monospaced">switch</span>. <span class="monospaced">f</span>\r
144is guaranteed to run atomically.</p></div>\r
145</li>\r
146</ul></div>\r
147</div>\r
148</div>\r
149<div class="sect1">\r
150<h2 id="_example_of_non_preemptive_threads">Example of non-preemptive threads</h2>\r
151<div class="sectionbody">\r
152<div class="listingblock">\r
153<div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">Queue</span><span class="p">:</span><span class="w"></span>\r
154<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
155<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>\r
156\r
157<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">unit</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>\r
158<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">enque</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;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="w"></span>\r
159<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">deque</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">&#39;a</span><span class="w"> </span><span class="n">option</span><span class="w"></span>\r
160<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
161<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
162<span class="w"> </span><span class="k">datatype</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">=</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="p">{</span><span class="n">front</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">list</span><span class="w"> </span><span class="n">ref</span><span class="p">,</span><span class="w"> </span><span class="n">back</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">list</span><span class="w"> </span><span class="n">ref</span><span class="p">}</span><span class="w"></span>\r
163\r
164<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">{</span><span class="n">front</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="p">[],</span><span class="w"> </span><span class="n">back</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="p">[]}</span><span class="w"></span>\r
165\r
166<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">enque</span><span class="w"> </span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="p">{</span><span class="n">back</span><span class="p">,</span><span class="w"> </span><span class="p">...},</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">back</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="n">!back</span><span class="w"></span>\r
167\r
168<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">deque</span><span class="w"> </span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="p">{</span><span class="n">front</span><span class="p">,</span><span class="w"> </span><span class="n">back</span><span class="p">})</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
169<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">!front</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
170<span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="k">case</span><span class="w"> </span><span class="n">!back</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
171<span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">NONE</span><span class="w"></span>\r
172<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="k">let</span><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">rev</span><span class="w"> </span><span class="n">l</span><span class="w"></span>\r
173<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
174<span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="k">raise</span><span class="w"> </span><span class="n">Fail</span><span class="w"> </span><span class="s">&quot;deque&quot;</span><span class="w"></span>\r
175<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">back</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="p">[];</span><span class="w"> </span><span class="n">front</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="n">l</span><span class="p">;</span><span class="w"> </span><span class="n">SOME</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"></span>\r
176<span class="w"> </span><span class="k">end</span><span class="p">)</span><span class="w"></span>\r
177<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">front</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="n">l</span><span class="p">;</span><span class="w"> </span><span class="n">SOME</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"></span>\r
178<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
179\r
180<span class="k">structure</span><span class="w"> </span><span class="n">Thread</span><span class="p">:</span><span class="w"></span>\r
181<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
182<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">exit</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">&#39;a</span><span class="w"></span>\r
183<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">run</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>\r
184<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">spawn</span><span class="p">:</span><span class="w"> </span><span class="p">(</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="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="w"></span>\r
185<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">yield</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>\r
186<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
187<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
188<span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">MLton</span><span class="w"></span>\r
189<span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">Thread</span><span class="w"></span>\r
190\r
191<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">topLevel</span><span class="p">:</span><span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">Runnable</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="n">option</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="n">NONE</span><span class="w"></span>\r
192\r
193<span class="w"> </span><span class="k">local</span><span class="w"></span>\r
194<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">threads</span><span class="p">:</span><span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">Runnable</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="n">Queue</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Queue</span><span class="p">.</span><span class="n">new</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
195<span class="w"> </span><span class="k">in</span><span class="w"></span>\r
196<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">ready</span><span class="w"> </span><span class="p">(</span><span class="n">t</span><span class="p">:</span><span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">Runnable</span><span class="p">.</span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">unit</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
197<span class="w"> </span><span class="n">Queue</span><span class="p">.</span><span class="n">enque</span><span class="p">(</span><span class="n">threads</span><span class="p">,</span><span class="w"> </span><span class="n">t</span><span class="p">)</span><span class="w"></span>\r
198<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">Runnable</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
199<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">Queue</span><span class="p">.</span><span class="n">deque</span><span class="w"> </span><span class="n">threads</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
200<span class="w"> </span><span class="n">NONE</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">valOf</span><span class="w"> </span><span class="p">(</span><span class="n">!topLevel</span><span class="p">)</span><span class="w"></span>\r
201<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">SOME</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>\r
202<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
203\r
204<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">exit</span><span class="w"> </span><span class="p">():</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">switch</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="p">())</span><span class="w"></span>\r
205\r
206<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="p">(</span><span class="n">f</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="p">):</span><span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">Runnable</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
207<span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">prepare</span><span class="w"></span>\r
208<span class="w"> </span><span class="p">(</span><span class="n">Thread</span><span class="p">.</span><span class="n">new</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">((</span><span class="n">f</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="k">handle</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">exit</span><span class="w"> </span><span class="p">())</span><span class="w"></span>\r
209<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">exit</span><span class="w"> </span><span class="p">())),</span><span class="w"></span>\r
210<span class="w"> </span><span class="p">())</span><span class="w"></span>\r
211\r
212<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">schedule</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">(</span><span class="n">ready</span><span class="w"> </span><span class="n">t</span><span class="p">;</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="p">())</span><span class="w"></span>\r
213\r
214<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">yield</span><span class="w"> </span><span class="p">():</span><span class="w"> </span><span class="n">unit</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">switch</span><span class="w"> </span><span class="p">(</span><span class="k">fn</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">schedule</span><span class="w"> </span><span class="p">(</span><span class="n">Thread</span><span class="p">.</span><span class="n">prepare</span><span class="w"> </span><span class="p">(</span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="p">())))</span><span class="w"></span>\r
215\r
216<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">spawn</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">ready</span><span class="w"> </span><span class="n">o</span><span class="w"> </span><span class="n">new</span><span class="w"></span>\r
217\r
218<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">run</span><span class="p">():</span><span class="w"> </span><span class="n">unit</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
219<span class="w"> </span><span class="p">(</span><span class="n">switch</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
220<span class="w"> </span><span class="p">(</span><span class="n">topLevel</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="n">SOME</span><span class="w"> </span><span class="p">(</span><span class="n">Thread</span><span class="p">.</span><span class="n">prepare</span><span class="w"> </span><span class="p">(</span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="p">()))</span><span class="w"></span>\r
221<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">next</span><span class="p">()))</span><span class="w"></span>\r
222<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">topLevel</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="n">NONE</span><span class="p">)</span><span class="w"></span>\r
223<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
224\r
225<span class="k">val</span><span class="w"> </span><span class="k">rec</span><span class="w"> </span><span class="n">loop</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
226<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
227<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">print</span><span class="p">(</span><span class="n">concat</span><span class="p">[</span><span class="n">Int</span><span class="p">.</span><span class="n">toString</span><span class="w"> </span><span class="n">n</span><span class="p">,</span><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>\r
228<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">yield</span><span class="p">()</span><span class="w"></span>\r
229<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">loop</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>\r
230\r
231<span class="k">val</span><span class="w"> </span><span class="k">rec</span><span class="w"> </span><span class="n">loop&#39;</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
232<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
233<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">Thread</span><span class="p">.</span><span class="n">spawn</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">loop</span><span class="w"> </span><span class="n">n</span><span class="p">);</span><span class="w"> </span><span class="n">loop&#39;</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">2</span><span class="p">))</span><span class="w"></span>\r
234\r
235<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">Thread</span><span class="p">.</span><span class="n">spawn</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">loop&#39;</span><span class="w"> </span><span class="mi">10</span><span class="p">)</span><span class="w"></span>\r
236\r
237<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">Thread</span><span class="p">.</span><span class="n">run</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
238\r
239<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="s">&quot;success</span><span class="se">\n</span><span class="s">&quot;</span><span class="w"></span>\r
240</pre></div></div></div>\r
241</div>\r
242</div>\r
243<div class="sect1">\r
244<h2 id="_example_of_preemptive_threads">Example of preemptive threads</h2>\r
245<div class="sectionbody">\r
246<div class="listingblock">\r
247<div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">Queue</span><span class="p">:</span><span class="w"></span>\r
248<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
249<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>\r
250\r
251<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">unit</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>\r
252<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">enque</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;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="w"></span>\r
253<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">deque</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">&#39;a</span><span class="w"> </span><span class="n">option</span><span class="w"></span>\r
254<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
255<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
256<span class="w"> </span><span class="k">datatype</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">=</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="p">{</span><span class="n">front</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">list</span><span class="w"> </span><span class="n">ref</span><span class="p">,</span><span class="w"> </span><span class="n">back</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">list</span><span class="w"> </span><span class="n">ref</span><span class="p">}</span><span class="w"></span>\r
257\r
258<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">{</span><span class="n">front</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="p">[],</span><span class="w"> </span><span class="n">back</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="p">[]}</span><span class="w"></span>\r
259\r
260<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">enque</span><span class="w"> </span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="p">{</span><span class="n">back</span><span class="p">,</span><span class="w"> </span><span class="p">...},</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">back</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="n">!back</span><span class="w"></span>\r
261\r
262<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">deque</span><span class="w"> </span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="p">{</span><span class="n">front</span><span class="p">,</span><span class="w"> </span><span class="n">back</span><span class="p">})</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
263<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">!front</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
264<span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="k">case</span><span class="w"> </span><span class="n">!back</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
265<span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">NONE</span><span class="w"></span>\r
266<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="k">let</span><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">rev</span><span class="w"> </span><span class="n">l</span><span class="w"></span>\r
267<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
268<span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="k">raise</span><span class="w"> </span><span class="n">Fail</span><span class="w"> </span><span class="s">&quot;deque&quot;</span><span class="w"></span>\r
269<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">back</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="p">[];</span><span class="w"> </span><span class="n">front</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="n">l</span><span class="p">;</span><span class="w"> </span><span class="n">SOME</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"></span>\r
270<span class="w"> </span><span class="k">end</span><span class="p">)</span><span class="w"></span>\r
271<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">front</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="n">l</span><span class="p">;</span><span class="w"> </span><span class="n">SOME</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"></span>\r
272<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
273\r
274<span class="k">structure</span><span class="w"> </span><span class="n">Thread</span><span class="p">:</span><span class="w"></span>\r
275<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
276<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">exit</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">&#39;a</span><span class="w"></span>\r
277<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">run</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>\r
278<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">spawn</span><span class="p">:</span><span class="w"> </span><span class="p">(</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="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="w"></span>\r
279<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">yield</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>\r
280<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
281<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
282<span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">Posix</span><span class="p">.</span><span class="n">Signal</span><span class="w"></span>\r
283<span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">MLton</span><span class="w"></span>\r
284<span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">Itimer</span><span class="w"> </span><span class="n">Signal</span><span class="w"> </span><span class="n">Thread</span><span class="w"></span>\r
285\r
286<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">topLevel</span><span class="p">:</span><span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">Runnable</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="n">option</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="n">NONE</span><span class="w"></span>\r
287\r
288<span class="w"> </span><span class="k">local</span><span class="w"></span>\r
289<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">threads</span><span class="p">:</span><span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">Runnable</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="n">Queue</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Queue</span><span class="p">.</span><span class="n">new</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
290<span class="w"> </span><span class="k">in</span><span class="w"></span>\r
291<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">ready</span><span class="w"> </span><span class="p">(</span><span class="n">t</span><span class="p">:</span><span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">Runnable</span><span class="p">.</span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">unit</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
292<span class="w"> </span><span class="n">Queue</span><span class="p">.</span><span class="n">enque</span><span class="p">(</span><span class="n">threads</span><span class="p">,</span><span class="w"> </span><span class="n">t</span><span class="p">)</span><span class="w"></span>\r
293<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">Runnable</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
294<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">Queue</span><span class="p">.</span><span class="n">deque</span><span class="w"> </span><span class="n">threads</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
295<span class="w"> </span><span class="n">NONE</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">valOf</span><span class="w"> </span><span class="p">(</span><span class="n">!topLevel</span><span class="p">)</span><span class="w"></span>\r
296<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">SOME</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>\r
297<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
298\r
299<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">exit</span><span class="w"> </span><span class="p">():</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">switch</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="p">())</span><span class="w"></span>\r
300\r
301<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="p">(</span><span class="n">f</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="p">):</span><span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">Runnable</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
302<span class="w"> </span><span class="n">Thread</span><span class="p">.</span><span class="n">prepare</span><span class="w"></span>\r
303<span class="w"> </span><span class="p">(</span><span class="n">Thread</span><span class="p">.</span><span class="n">new</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">((</span><span class="n">f</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="k">handle</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">exit</span><span class="w"> </span><span class="p">())</span><span class="w"></span>\r
304<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">exit</span><span class="w"> </span><span class="p">())),</span><span class="w"></span>\r
305<span class="w"> </span><span class="p">())</span><span class="w"></span>\r
306\r
307<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">schedule</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">(</span><span class="n">ready</span><span class="w"> </span><span class="n">t</span><span class="p">;</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="p">())</span><span class="w"></span>\r
308\r
309<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">yield</span><span class="w"> </span><span class="p">():</span><span class="w"> </span><span class="n">unit</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">switch</span><span class="w"> </span><span class="p">(</span><span class="k">fn</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">schedule</span><span class="w"> </span><span class="p">(</span><span class="n">Thread</span><span class="p">.</span><span class="n">prepare</span><span class="w"> </span><span class="p">(</span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="p">())))</span><span class="w"></span>\r
310\r
311<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">spawn</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">ready</span><span class="w"> </span><span class="n">o</span><span class="w"> </span><span class="n">new</span><span class="w"></span>\r
312\r
313<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">setItimer</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
314<span class="w"> </span><span class="n">Itimer</span><span class="p">.</span><span class="n">set</span><span class="w"> </span><span class="p">(</span><span class="n">Itimer</span><span class="p">.</span><span class="n">Real</span><span class="p">,</span><span class="w"></span>\r
315<span class="w"> </span><span class="p">{</span><span class="n">value</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">t</span><span class="p">,</span><span class="w"></span>\r
316<span class="w"> </span><span class="n">interval</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">t</span><span class="p">})</span><span class="w"></span>\r
317\r
318<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">run</span><span class="w"> </span><span class="p">():</span><span class="w"> </span><span class="n">unit</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
319<span class="w"> </span><span class="p">(</span><span class="n">switch</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
320<span class="w"> </span><span class="p">(</span><span class="n">topLevel</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="n">SOME</span><span class="w"> </span><span class="p">(</span><span class="n">Thread</span><span class="p">.</span><span class="n">prepare</span><span class="w"> </span><span class="p">(</span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="p">()))</span><span class="w"></span>\r
321<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">setHandler</span><span class="w"> </span><span class="p">(</span><span class="n">alrm</span><span class="p">,</span><span class="w"> </span><span class="n">Handler</span><span class="p">.</span><span class="n">handler</span><span class="w"> </span><span class="n">schedule</span><span class="p">)</span><span class="w"></span>\r
322<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">setItimer</span><span class="w"> </span><span class="p">(</span><span class="n">Time</span><span class="p">.</span><span class="n">fromMilliseconds</span><span class="w"> </span><span class="mi">20</span><span class="p">)))))</span><span class="w"></span>\r
323<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">setItimer</span><span class="w"> </span><span class="n">Time</span><span class="p">.</span><span class="n">zeroTime</span><span class="w"></span>\r
324<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">ignore</span><span class="w"> </span><span class="n">alrm</span><span class="w"></span>\r
325<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">topLevel</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="n">NONE</span><span class="p">)</span><span class="w"></span>\r
326<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
327\r
328<span class="k">val</span><span class="w"> </span><span class="k">rec</span><span class="w"> </span><span class="n">delay</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
329<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
330<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">delay</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>\r
331\r
332<span class="k">val</span><span class="w"> </span><span class="k">rec</span><span class="w"> </span><span class="n">loop</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
333<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
334<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">delay</span><span class="w"> </span><span class="mi">500000</span><span class="p">;</span><span class="w"> </span><span class="n">loop</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>\r
335\r
336<span class="k">val</span><span class="w"> </span><span class="k">rec</span><span class="w"> </span><span class="n">loop&#39;</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
337<span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
338<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">Thread</span><span class="p">.</span><span class="n">spawn</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">loop</span><span class="w"> </span><span class="n">n</span><span class="p">);</span><span class="w"> </span><span class="n">loop&#39;</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>\r
339\r
340<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">Thread</span><span class="p">.</span><span class="n">spawn</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">loop&#39;</span><span class="w"> </span><span class="mi">10</span><span class="p">)</span><span class="w"></span>\r
341\r
342<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">Thread</span><span class="p">.</span><span class="n">run</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
343\r
344<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="s">&quot;success</span><span class="se">\n</span><span class="s">&quot;</span><span class="w"></span>\r
345</pre></div></div></div>\r
346</div>\r
347</div>\r
348</div>\r
349<div id="footnotes"><hr></div>\r
350<div id="footer">\r
351<div id="footer-text">\r
352</div>\r
353<div id="footer-badges">\r
354</div>\r
355</div>\r
356</body>\r
357</html>\r