File: ConcurrentML

package info (click to toggle)
mlton 20130715-3
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 60,900 kB
  • ctags: 69,386
  • sloc: xml: 34,418; ansic: 17,399; lisp: 2,879; makefile: 1,605; sh: 1,254; pascal: 256; python: 143; asm: 97
file content (135 lines) | stat: -rw-r--r-- 7,259 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="AsciiDoc 8.6.8">
<title>ConcurrentML</title>
<link rel="stylesheet" href="./asciidoc.css" type="text/css">
<link rel="stylesheet" href="./pygments.css" type="text/css">


<script type="text/javascript" src="./asciidoc.js"></script>
<script type="text/javascript">
/*<![CDATA[*/
asciidoc.install();
/*]]>*/
</script>
<link rel="stylesheet" href="./mlton.css" type="text/css"/>
</head>
<body class="article">
<div id="banner">
<div id="banner-home">
<a href="./Home">MLton 20130715</a>
</div>
</div>
<div id="header">
<h1>ConcurrentML</h1>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph"><p><a href="http://cml.cs.uchicago.edu/">Concurrent ML</a> is an SML concurrency
library based on synchronous message passing.  MLton has an initial
port of CML from SML/NJ, but is missing a thread-safe wrapper around
the Basis Library and event-based equivalents to <span class="monospaced">IO</span> and <span class="monospaced">OS</span>
functions.</p></div>
<div class="paragraph"><p>All of the core CML functionality is present.</p></div>
<div class="listingblock">
<div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">CML</span><span class="p">:</span><span class="w"> </span><span class="n">CML</span><span class="w"></span>
<span class="k">structure</span><span class="w"> </span><span class="n">SyncVar</span><span class="p">:</span><span class="w"> </span><span class="n">SYNC_VAR</span><span class="w"></span>
<span class="k">structure</span><span class="w"> </span><span class="n">Mailbox</span><span class="p">:</span><span class="w"> </span><span class="n">MAILBOX</span><span class="w"></span>
<span class="k">structure</span><span class="w"> </span><span class="n">Multicast</span><span class="p">:</span><span class="w"> </span><span class="n">MULTICAST</span><span class="w"></span>
<span class="k">structure</span><span class="w"> </span><span class="n">SimpleRPC</span><span class="p">:</span><span class="w"> </span><span class="n">SIMPLE_RPC</span><span class="w"></span>
<span class="k">structure</span><span class="w"> </span><span class="n">RunCML</span><span class="p">:</span><span class="w"> </span><span class="n">RUN_CML</span><span class="w"></span>
</pre></div></div></div>
<div class="paragraph"><p>The <span class="monospaced">RUN_CML</span> signature is minimal.</p></div>
<div class="listingblock">
<div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">RUN_CML</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
<span class="w">   </span><span class="k">sig</span><span class="w"></span>
<span class="w">      </span><span class="k">val</span><span class="w"> </span><span class="n">isRunning</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">bool</span><span class="w"></span>
<span class="w">      </span><span class="k">val</span><span class="w"> </span><span class="n">doit</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="n">*</span><span class="w"> </span><span class="n">Time</span><span class="p">.</span><span class="n">time</span><span class="w"> </span><span class="n">option</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">OS</span><span class="p">.</span><span class="n">Process</span><span class="p">.</span><span class="n">status</span><span class="w"></span>
<span class="w">      </span><span class="k">val</span><span class="w"> </span><span class="n">shutdown</span><span class="p">:</span><span class="w"> </span><span class="n">OS</span><span class="p">.</span><span class="n">Process</span><span class="p">.</span><span class="n">status</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="w">   </span><span class="k">end</span><span class="w"></span>
</pre></div></div></div>
<div class="paragraph"><p>MLton&#8217;s <span class="monospaced">RunCML</span> structure does not include all of the cleanup and
logging operations of SML/NJ&#8217;s <span class="monospaced">RunCML</span> structure.  However, the
implementation does include the <span class="monospaced">CML.timeOutEvt</span> and <span class="monospaced">CML.atTimeEvt</span>
functions, and a preemptive scheduler that knows to sleep when there
are no ready threads and some threads blocked on time events.</p></div>
<div class="paragraph"><p>Because MLton does not wrap the Basis Library for CML, the "right" way
to call a Basis Library function that is stateful is to wrap the call
with <span class="monospaced">MLton.Thread.atomically</span>.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_usage">Usage</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
You can import the CML Library into an MLB file with:
</p>
<table class="tableblock frame-all grid-all"
style="
width:100%;
">
<col style="width:50%;">
<col style="width:50%;">
<thead>
<tr>
<th class="tableblock halign-left valign-top" >MLB file</th>
<th class="tableblock halign-left valign-top" >Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/cml/cml.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock"></p></td>
</tr>
</tbody>
</table>
</li>
<li>
<p>
If you are porting a project from SML/NJ&#8217;s <a href="CompilationManager">CompilationManager</a> to
MLton&#8217;s <a href="MLBasis"> ML Basis system</a> using <span class="monospaced">cm2mlb</span>, note that the
following map is included by default:
</p>
<div class="listingblock">
<div class="content monospaced">
<pre># CML Library
$cml                                    $(SML_LIB)/cml
$cml/cml.cm                             $(SML_LIB)/cml/cml.mlb</pre>
</div></div>
<div class="paragraph"><p>This will automatically convert a <span class="monospaced">$cml/cml.cm</span> import in an input <span class="monospaced">.cm</span> file into a <span class="monospaced">$(SML_LIB)/cml/cml.mlb</span> import in the output <span class="monospaced">.mlb</span> file.</p></div>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="_also_see">Also see</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
<a href="ConcurrentMLImplementation">ConcurrentMLImplementation</a>
</p>
</li>
<li>
<p>
<a href="eXene">eXene</a>
</p>
</li>
</ul></div>
</div>
</div>
</div>
<div id="footnotes"><hr></div>
<div id="footer">
<div id="footer-text">
</div>
<div id="footer-badges">
</div>
</div>
</body>
</html>