diff options
author | Benoit Germain <bnt.germain@gmail.com> | 2011-11-05 17:31:02 +0100 |
---|---|---|
committer | Benoit Germain <bnt.germain@gmail.com> | 2011-11-05 17:31:02 +0100 |
commit | 053f7cff3c95acb915e6babfd306971f11bb7986 (patch) | |
tree | ee38c60b1119d34eb96aea1105ef033e851d266e /docs | |
parent | 717eadee9c3644fabb32c7ee59949f2846143690 (diff) | |
download | lanes-053f7cff3c95acb915e6babfd306971f11bb7986.tar.gz lanes-053f7cff3c95acb915e6babfd306971f11bb7986.tar.bz2 lanes-053f7cff3c95acb915e6babfd306971f11bb7986.zip |
* process exit change: close everything at GC when main state closes, not when atexit() handlers are processed
* Lua 5.2-style module:
* module() is no longer used to implement lanes.lua
* a global "lanes" variable is no longer created when the module is required
* the Lanes module table is returned instead
* Lanes must be initialized before used:
* the first occurence of 'require "lanes"' produces a minimal interface that only contains a configure() function
* the remainder of the interface is made available once this function is called
* subsequent calls to configure() do nothing
* configure() controls the number of keeper states and the startup of timers
* LuaJIT 2 compatibility
* non-Lua functions are no longer copied by creating a C closure from a C pointer, but through 2-way lookup tables
* this means that if a lane function body pulls non-Lua functions, the lane generator description must contain the list of libraries and modules that exports them
* introduces a change in configuration .globals management: contents are copied *after* std libs are loaded
* new .required configuration entry to list modules that must be require()'ed before lane body is transferred
* lane:cancel() wakes up waiting lindas like what is done at lane shutdown
Diffstat (limited to 'docs')
-rw-r--r-- | docs/index.html | 117 |
1 files changed, 107 insertions, 10 deletions
diff --git a/docs/index.html b/docs/index.html index 3c4fe59..3c9abfe 100644 --- a/docs/index.html +++ b/docs/index.html | |||
@@ -54,9 +54,9 @@ | |||
54 | <a href="#changes">Change log</a> | 54 | <a href="#changes">Change log</a> |
55 | <!-- ... --> | 55 | <!-- ... --> |
56 | 56 | ||
57 | <p><br/><font size="-1"><i>Copyright © 2007-11 Asko Kauppi. All rights reserved.</i> | 57 | <p><br/><font size="-1"><i>Copyright © 2007-12 Asko Kauppi, Benoit Germain. All rights reserved.</i> |
58 | <br>Lua Lanes is published under the same <A HREF="http://en.wikipedia.org/wiki/MIT_License">MIT license</A> as Lua 5.1. | 58 | <br>Lua Lanes is published under the same <A HREF="http://en.wikipedia.org/wiki/MIT_License">MIT license</A> as Lua 5.1. |
59 | </p><p>This document was revised on 1-Mar-11, and applies to version 2.1.0. | 59 | </p><p>This document was revised on 5-Nov-11, and applies to version 3.0-beta. |
60 | </font></p> | 60 | </font></p> |
61 | 61 | ||
62 | </center> | 62 | </center> |
@@ -162,7 +162,51 @@ Or use <A HREF="http://www.luarocks.org" TARGET="_blank">Lua Rocks</A> package m | |||
162 | 162 | ||
163 | <!-- launching +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> | 163 | <!-- launching +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> |
164 | <hr/> | 164 | <hr/> |
165 | <h2 id="creation">Creation</h2> | 165 | |
166 | <h2 id="initialization">Initialization</h2> | ||
167 | |||
168 | <p> | ||
169 | The following sample shows how to initialize the Lanes module. | ||
170 | </p> | ||
171 | |||
172 | <table border="1" bgcolor="#FFFFE0" width="500"> | ||
173 | <tr> | ||
174 | <td> | ||
175 | <pre> | ||
176 | local lanes = require "lanes" | ||
177 | lanes.configure( 1) | ||
178 | </pre> | ||
179 | </table> | ||
180 | |||
181 | <p> | ||
182 | Starting with version 3.0-beta, requiring the module follows Lua 5.2 rules: | ||
183 | the module is not available under the global name "lanes", but has to be accessed | ||
184 | through require's return value. | ||
185 | After lanes is required, it is necessary to call lanes.configure(), which is the | ||
186 | only function exposed by the module at this point. Calling configure() will | ||
187 | perform one-time initializations and make the rest of the API available. | ||
188 | At the same time, configure() itself will be replaced by another function that | ||
189 | raises an error if called with differing arguments. | ||
190 | </p> | ||
191 | |||
192 | <p> | ||
193 | <table border="1" bgcolor="#E0E0FF" cellpadding="10"> | ||
194 | <tr> | ||
195 | <td> | ||
196 | <code> | ||
197 | lanes.configure( [nb_keepers] [, "NO_TIMERS"]) | ||
198 | </code> | ||
199 | </table> | ||
200 | </p> | ||
201 | <p> | ||
202 | <tt>lanes.configure</tt> accepts 2 arguments. The first one controls the number | ||
203 | of keeper states used internally by lindas to transfer data between lanes. (see below). | ||
204 | Default is 1. | ||
205 | </p> | ||
206 | <p>If the second argument is equal to <tt>"NO_TIMERS"</tt>, Lanes doesn't start the timer service, | ||
207 | and the associated API will be absent from the interface (see below). | ||
208 | </p> | ||
209 | <h2 id="creation">Creation</h2> | ||
166 | 210 | ||
167 | <p>The following sample shows preparing a function for parallel calling, and | 211 | <p>The following sample shows preparing a function for parallel calling, and |
168 | calling it with varying arguments. Each of the two results is calculated in | 212 | calling it with varying arguments. Each of the two results is calculated in |
@@ -172,7 +216,8 @@ joins the threads, waiting for any results not already there. | |||
172 | 216 | ||
173 | <table border=1 bgcolor="#FFFFE0" width=500><tr><td> | 217 | <table border=1 bgcolor="#FFFFE0" width=500><tr><td> |
174 | <pre> | 218 | <pre> |
175 | require "lanes" | 219 | local lanes = require "lanes" |
220 | lanes.configure( 1) | ||
176 | 221 | ||
177 | f= lanes.gen( function(n) return 2*n end ) | 222 | f= lanes.gen( function(n) return 2*n end ) |
178 | a= f(1) | 223 | a= f(1) |
@@ -189,7 +234,7 @@ joins the threads, waiting for any results not already there. | |||
189 | lane_h= func( ... )</code> | 234 | lane_h= func( ... )</code> |
190 | </table> | 235 | </table> |
191 | </p> | 236 | </p> |
192 | </p><p> | 237 | <p> |
193 | The function returned by <tt>lanes.gen()</tt> is a "generator" for | 238 | The function returned by <tt>lanes.gen()</tt> is a "generator" for |
194 | launching any number of lanes. They will share code, options, initial globals, | 239 | launching any number of lanes. They will share code, options, initial globals, |
195 | but the particular arguments may vary. Only calling the generator function | 240 | but the particular arguments may vary. Only calling the generator function |
@@ -256,6 +301,23 @@ also in the new lanes. | |||
256 | modifying one will only affect the particular lane. | 301 | modifying one will only affect the particular lane. |
257 | </td></tr> | 302 | </td></tr> |
258 | 303 | ||
304 | <tr valign="top"> | ||
305 | <td/> | ||
306 | <td> | ||
307 | <code>.required</code> <br/>modules_tbl | ||
308 | </td> | ||
309 | <td> | ||
310 | Lists modules that have to be required in order to be able to trasnfer | ||
311 | functions they exposed. Starting with Lanes 3.0-beta, non-Lua functions are | ||
312 | no longer copied by recreating a C closure from a C pointer, but are searched | ||
313 | in lookup tables. These tables are built from the modules listed here. <tt>required</tt> | ||
314 | must be a list of strings, each one being the name of a module to be required. | ||
315 | <br> | ||
316 | The global values of different lanes are in no manner connected; | ||
317 | modifying one will only affect the particular lane. | ||
318 | </td> | ||
319 | </tr> | ||
320 | |||
259 | <tr valign=top><td width=40><td> | 321 | <tr valign=top><td width=40><td> |
260 | <code>.priority</code> <br/><nobr>-2..+2</nobr></td> | 322 | <code>.priority</code> <br/><nobr>-2..+2</nobr></td> |
261 | <td>The priority of lanes generated. -2 is lowest, +2 is highest. | 323 | <td>The priority of lanes generated. -2 is lowest, +2 is highest. |
@@ -273,6 +335,7 @@ also in the new lanes. | |||
273 | <td> | 335 | <td> |
274 | <code>package.path</code> and <code>package.cpath</code> overrides, if needed. | 336 | <code>package.path</code> and <code>package.cpath</code> overrides, if needed. |
275 | Specifying these when <code>libs_str</code> doesn't cause the <code>package</code> library to be loaded will generate an error. | 337 | Specifying these when <code>libs_str</code> doesn't cause the <code>package</code> library to be loaded will generate an error. |
338 | If not specified, the created lane will receive the current values of <tt>package.path</tt> and <tt>package.cpath</tt>. | ||
276 | <br> | 339 | <br> |
277 | </td> | 340 | </td> |
278 | </tr> | 341 | </tr> |
@@ -407,8 +470,9 @@ OS thread running the lane is forcefully killed. This means no GC, and should | |||
407 | generally be the last resort. | 470 | generally be the last resort. |
408 | </p> | 471 | </p> |
409 | <p>Cancellation is tested <u>before</u> going to sleep in <tt>receive()</tt> or <tt>send()</tt> calls | 472 | <p>Cancellation is tested <u>before</u> going to sleep in <tt>receive()</tt> or <tt>send()</tt> calls |
410 | and after executing <tt>cancelstep</tt> Lua statements. A currently pending <tt>receive()</tt> | 473 | and after executing <tt>cancelstep</tt> Lua statements. Starting with version 3.0-beta, a pending <tt>receive()</tt> |
411 | or <tt>send()</tt> call is currently not awakened, and may be a reason for a non-detected cancel. | 474 | or <tt>send()</tt> call is awakened. This means the execution of the lane will resume although the operation has |
475 | not completed, to give the lane a chance to detect cancellation. The code should be able to handle this situation appropriately if required. | ||
412 | It is also possible to manually test for cancel requests with <tt>cancel_test()</tt>. | 476 | It is also possible to manually test for cancel requests with <tt>cancel_test()</tt>. |
413 | </p> | 477 | </p> |
414 | 478 | ||
@@ -619,6 +683,8 @@ you want to use several? | |||
619 | <li>Performance. Changing any slot in a Linda causes all pending threads | 683 | <li>Performance. Changing any slot in a Linda causes all pending threads |
620 | for that Linda to be momentarily awakened (at least in the C level). | 684 | for that Linda to be momentarily awakened (at least in the C level). |
621 | This can degrade performance due to unnecessary OS level context switches. | 685 | This can degrade performance due to unnecessary OS level context switches. |
686 | The more keeper states you declared with <tt>lanes.configure()</tt> the less | ||
687 | this should be a problem. | ||
622 | </li> | 688 | </li> |
623 | </ul> | 689 | </ul> |
624 | 690 | ||
@@ -639,6 +705,10 @@ events to a common Linda, but... :).</font> | |||
639 | <code>= lanes.timer( linda_h, key, date_tbl|first_secs [,period_secs] )</code> | 705 | <code>= lanes.timer( linda_h, key, date_tbl|first_secs [,period_secs] )</code> |
640 | </table> | 706 | </table> |
641 | 707 | ||
708 | <p> | ||
709 | Timers are implemented as a lane. They can be disabled by passing <tt>"NO_TIMERS"</tt> | ||
710 | to <tt>lanes.configure()</tt>. | ||
711 | </p> | ||
642 | <p> | 712 | <p> |
643 | Timers can be run once, or in a reoccurring fashion (<tt>period_secs > 0</tt>). | 713 | Timers can be run once, or in a reoccurring fashion (<tt>period_secs > 0</tt>). |
644 | The first occurrence can be given either as a date or as a relative delay in seconds. | 714 | The first occurrence can be given either as a date or as a relative delay in seconds. |
@@ -655,7 +725,8 @@ A timer can be stopped simply by <tt>first_secs=0</tt> and no period. | |||
655 | 725 | ||
656 | <table border=1 bgcolor="#FFFFE0" width=500><tr><td> | 726 | <table border=1 bgcolor="#FFFFE0" width=500><tr><td> |
657 | <pre> | 727 | <pre> |
658 | require "lanes" | 728 | local lanes = require "lanes" |
729 | lanes.configure( 1) | ||
659 | 730 | ||
660 | local linda= lanes.linda() | 731 | local linda= lanes.linda() |
661 | 732 | ||
@@ -991,11 +1062,37 @@ its actual value. | |||
991 | 1062 | ||
992 | <p> | 1063 | <p> |
993 | 1064 | ||
1065 | Nov-2011 | ||
1066 | <ul> | ||
1067 | <li>process exit change: close everything at GC when main state closes, not when atexit() handlers are processed</li> | ||
1068 | <li>Lua 5.2-style module:</li> | ||
1069 | <ul> | ||
1070 | <li>module() is no longer used to implement lanes.lua</li> | ||
1071 | <li>a global "lanes" variable is no longer created when the module is required</li> | ||
1072 | <li>the Lanes module table is returned instead</li> | ||
1073 | </ul> | ||
1074 | <li>Lanes must be initialized before used:</li> | ||
1075 | <ul> | ||
1076 | <li>the first occurence of 'require "lanes"' produces a minimal interface that only contains a configure() function</li> | ||
1077 | <li>the remainder of the interface is made available once this function is called</li> | ||
1078 | <li>subsequent calls to configure() do nothing</li> | ||
1079 | <li>configure() controls the number of keeper states and the startup of timers</li> | ||
1080 | </ul> | ||
1081 | <li>* LuaJIT 2 compatibility</li> | ||
1082 | <ul> | ||
1083 | <li>non-Lua functions are no longer copied by creating a C closure from a C pointer, but through 2-way lookup tables</li> | ||
1084 | <li>this means that if a lane function body pulls non-Lua functions, the lane generator description must contain the list of libraries and modules that exports them</li> | ||
1085 | <li>introduces a change in configuration .globals management: contents are copied *after* std libs are loaded</li> | ||
1086 | <li>new .required configuration entry to list modules that must be require()'ed before lane body is transferred</li> | ||
1087 | </ul> | ||
1088 | <li>lane:cancel() wakes up waiting lindas like what is done at lane shutdown</li> | ||
1089 | </ul> | ||
1090 | |||
994 | Mar-2011 (not yet versioned) | 1091 | Mar-2011 (not yet versioned) |
995 | <ul> | 1092 | <ul> |
996 | <li>linda honors __tostring and __concat</li> | 1093 | <li>linda honors __tostring and __concat</li> |
997 | <li>new accessor linda:keys(), to retrieve the list of keys with pending data inside a linda</li> | 1094 | <li>new accessor linda:count(), to get info about data stored inside a linda.</li> |
998 | <li>new lanes options packagepath and packagecpath, in case one needs to set them differently than the default</li> | 1095 | <li>new lanes options packagepath and packagecpath, in case one needs to set them differently than the default.</li> |
999 | </ul> | 1096 | </ul> |
1000 | 1097 | ||
1001 | Mar-2011 (2.1.0) | 1098 | Mar-2011 (2.1.0) |