diff options
| author | Benoit Germain <bnt.germain@gmail.com> | 2011-02-12 17:06:03 +0100 |
|---|---|---|
| committer | Benoit Germain <bnt.germain@gmail.com> | 2011-02-12 17:06:03 +0100 |
| commit | a661736f7984292a41d71847de68590f6b8ca08a (patch) | |
| tree | 43e0799c20e835f1cc2d8c5fa1324b64301763e0 /docs | |
| parent | c91a03bd956bf19848253bded8217687ccd2ad81 (diff) | |
| download | lanes-a661736f7984292a41d71847de68590f6b8ca08a.tar.gz lanes-a661736f7984292a41d71847de68590f6b8ca08a.tar.bz2 lanes-a661736f7984292a41d71847de68590f6b8ca08a.zip | |
Changed idfunc signature and contract to clarify that fact it is not lua-callable and to be able to require the module it was exported from in the target lanes.
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/index.html | 99 |
1 files changed, 53 insertions, 46 deletions
diff --git a/docs/index.html b/docs/index.html index fec2212..9d66510 100644 --- a/docs/index.html +++ b/docs/index.html | |||
| @@ -21,11 +21,11 @@ | |||
| 21 | <tr> | 21 | <tr> |
| 22 | <td align="center"> | 22 | <td align="center"> |
| 23 | <a href="http://www.lua.org"> | 23 | <a href="http://www.lua.org"> |
| 24 | <img src="http://akauppi.googlepages.com/multi.png" alt="Lua" align="middle" border="0" height="120" width="128" /> | 24 | <img src="multi.png" alt="Lua" align="middle" border="0" height="120" width="128" /> |
| 25 | <img src="http://akauppi.googlepages.com/multi.png" alt="Lua" align="middle" border="0" height="120" width="128" /> | 25 | <img src="multi.png" alt="Lua" align="middle" border="0" height="120" width="128" /> |
| 26 | <img src="http://akauppi.googlepages.com/multi.png" alt="Lua" align="middle" border="0" height="120" width="128" /> | 26 | <img src="multi.png" alt="Lua" align="middle" border="0" height="120" width="128" /> |
| 27 | <img src="http://akauppi.googlepages.com/multi.png" alt="Lua" align="middle" border="0" height="120" width="128" /> | 27 | <img src="multi.png" alt="Lua" align="middle" border="0" height="120" width="128" /> |
| 28 | <img src="http://akauppi.googlepages.com/multi.png" alt="Lua" align="middle" border="0" height="120" width="128" /> | 28 | <img src="multi.png" alt="Lua" align="middle" border="0" height="120" width="128" /> |
| 29 | </a></td> | 29 | </a></td> |
| 30 | </tr> | 30 | </tr> |
| 31 | <tr> | 31 | <tr> |
| @@ -56,7 +56,7 @@ | |||
| 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-11 Asko Kauppi. 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 3-Jan-11, and applies to version 2.0.10. | 59 | </p><p>This document was revised on 12-Feb-11, and applies to version 2.0.11. |
| 60 | </font></p> | 60 | </font></p> |
| 61 | 61 | ||
| 62 | </center> | 62 | </center> |
| @@ -124,15 +124,14 @@ | |||
| 124 | <li>Windows 2000/XP and later <font size="-1">(MinGW or Visual C++ 2005/2008)</font></li> | 124 | <li>Windows 2000/XP and later <font size="-1">(MinGW or Visual C++ 2005/2008)</font></li> |
| 125 | <!-- | 125 | <!-- |
| 126 | Other OS'es here once people help test them. (and the tester's name) | 126 | Other OS'es here once people help test them. (and the tester's name) |
| 127 | 127 | ||
| 128 | Win64, BSD, Linux x64, Linux embedded, QNX, Solaris, ... | 128 | Win64, BSD, Linux x64, Linux embedded, QNX, Solaris, ... |
| 129 | --> | 129 | --> |
| 130 | </ul> | 130 | </ul> |
| 131 | 131 | ||
| 132 | <p>The underlying threading code can be compiled either towards Win32 API | 132 | <p>The underlying threading code can be compiled either towards Win32 API |
| 133 | or <a TARGET="_blank" HREF="http://en.wikipedia.org/wiki/POSIX_Threads">Pthreads</a>. Unfortunately, thread prioritation under Pthreads is a JOKE, | 133 | or <a TARGET="_blank" HREF="http://en.wikipedia.org/wiki/POSIX_Threads">Pthreads</a>. Unfortunately, thread prioritization under Pthreads is a JOKE, |
| 134 | requiring OS specific tweaks and guessing undocumented behaviour. Other | 134 | requiring OS specific tweaks and guessing undocumented behaviour. Other features should be portable to any modern platform. |
| 135 | features should be portable to any modern platform. | ||
| 136 | </p> | 135 | </p> |
| 137 | </p> | 136 | </p> |
| 138 | 137 | ||
| @@ -147,7 +146,7 @@ details and limitations. | |||
| 147 | </p> | 146 | </p> |
| 148 | 147 | ||
| 149 | <p>To install Lanes, all you need are the <tt>lanes.lua</tt> and <tt>lua51-lanes.so|dll</tt> | 148 | <p>To install Lanes, all you need are the <tt>lanes.lua</tt> and <tt>lua51-lanes.so|dll</tt> |
| 150 | files to be reachable by Lua (see LUA_PATH, LUA_CPATH). | 149 | files to be reachable by Lua (see LUA_PATH, LUA_CPATH). |
| 151 | 150 | ||
| 152 | Or use <A HREF="http://www.luarocks.org" TARGET="_blank">Lua Rocks</A> package management. | 151 | Or use <A HREF="http://www.luarocks.org" TARGET="_blank">Lua Rocks</A> package management. |
| 153 | </p> | 152 | </p> |
| @@ -264,7 +263,7 @@ also in the new lanes. | |||
| 264 | by platform. Especially Linux kernel 2.6 is not supporting priorities in user mode. | 263 | by platform. Especially Linux kernel 2.6 is not supporting priorities in user mode. |
| 265 | </td></tr> | 264 | </td></tr> |
| 266 | </table> | 265 | </table> |
| 267 | 266 | ||
| 268 | </p> | 267 | </p> |
| 269 | 268 | ||
| 270 | <h3>Free running lanes</h3> | 269 | <h3>Free running lanes</h3> |
| @@ -383,7 +382,7 @@ for the request to be processed, or a timeout to occur. | |||
| 383 | Returns <tt>true</tt> if the lane was already done (in <tt>"done"</tt>, <tt>"error"</tt> or <tt>"cancelled"</tt> status) | 382 | Returns <tt>true</tt> if the lane was already done (in <tt>"done"</tt>, <tt>"error"</tt> or <tt>"cancelled"</tt> status) |
| 384 | or if the cancellation was fruitful within timeout period. | 383 | or if the cancellation was fruitful within timeout period. |
| 385 | </p><p> | 384 | </p><p> |
| 386 | If the lane is still running and <tt>force_kill</tt> is <tt>true</tt>, the | 385 | If the lane is still running and <tt>force_kill</tt> is <tt>true</tt>, the |
| 387 | OS thread running the lane is forcefully killed. This means no GC, and should | 386 | OS thread running the lane is forcefully killed. This means no GC, and should |
| 388 | generally be the last resort. | 387 | generally be the last resort. |
| 389 | </p> | 388 | </p> |
| @@ -404,16 +403,16 @@ or <tt>send</tt> call is currently not awakened, and may be a reason for a non-d | |||
| 404 | </table> | 403 | </table> |
| 405 | 404 | ||
| 406 | <p>The <tt>error</tt> call is used for throwing exceptions in Lua. What Lua | 405 | <p>The <tt>error</tt> call is used for throwing exceptions in Lua. What Lua |
| 407 | does not offer, however, is scoped <a href="http://en.wikipedia.org/wiki/Finalizer">finalizers</a> | 406 | does not offer, however, is scoped <a href="http://en.wikipedia.org/wiki/Finalizer">finalizers</a> |
| 408 | that would get called when a certain block of instructions gets exited, whether | 407 | that would get called when a certain block of instructions gets exited, whether |
| 409 | through peaceful return or abrupt <tt>error</tt>. | 408 | through peaceful return or abrupt <tt>error</tt>. |
| 410 | </p> | 409 | </p> |
| 411 | <p>Since 2.0.3, Lanes prepares a function <tt>set_finalizer</tt> for doing this. | 410 | <p>Since 2.0.3, Lanes prepares a function <tt>set_finalizer</tt> for doing this. |
| 412 | Any functions given to it will be called in the lane Lua state, just prior to | 411 | Any functions given to it will be called in the lane Lua state, just prior to |
| 413 | closing it. They are not called in any particular order. | 412 | closing it. They are not called in any particular order. |
| 414 | </p> | 413 | </p> |
| 415 | <p>An error in a finalizer itself overrides the state of the regular chunk | 414 | <p>An error in a finalizer itself overrides the state of the regular chunk |
| 416 | (in practise, it would be highly preferable <i>not</i> to have errors in finalizers). | 415 | (in practise, it would be highly preferable <i>not</i> to have errors in finalizers). |
| 417 | If one finalizer errors, the others may not get called. | 416 | If one finalizer errors, the others may not get called. |
| 418 | </p> | 417 | </p> |
| 419 | 418 | ||
| @@ -424,7 +423,7 @@ If one finalizer errors, the others may not get called. | |||
| 424 | 423 | ||
| 425 | <p>Communications between lanes is completely detached from the lane handles | 424 | <p>Communications between lanes is completely detached from the lane handles |
| 426 | themselves. By itself, a lane can only provide return values once it's finished, | 425 | themselves. By itself, a lane can only provide return values once it's finished, |
| 427 | or throw an error. Needs to communicate during runtime are handled by <A HREF="http://en.wikipedia.org/wiki/Linda_%28coordination_language%29" TARGET="_blank">Linda objects</A>, which are | 426 | or throw an error. Needs to communicate during runtime are handled by <A HREF="http://en.wikipedia.org/wiki/Linda_%28coordination_language%29" TARGET="_blank">Linda objects</A>, which are |
| 428 | <A HREF="#deep_userdata">deep userdata</A> instances. They can be provided to a lane | 427 | <A HREF="#deep_userdata">deep userdata</A> instances. They can be provided to a lane |
| 429 | as startup parameters, upvalues or in some other Linda's message. | 428 | as startup parameters, upvalues or in some other Linda's message. |
| 430 | </p><p> | 429 | </p><p> |
| @@ -445,7 +444,7 @@ level locking is required; each Linda operation is atomic. | |||
| 445 | linda:send( "x", i ) -- linda as upvalue | 444 | linda:send( "x", i ) -- linda as upvalue |
| 446 | end | 445 | end |
| 447 | end | 446 | end |
| 448 | 447 | ||
| 449 | a= lanes.gen("",loop)( 10000 ) | 448 | a= lanes.gen("",loop)( 10000 ) |
| 450 | 449 | ||
| 451 | while true do | 450 | while true do |
| @@ -512,7 +511,7 @@ many producers, and many consumers. It's up to you. | |||
| 512 | if the queue limit was met, and the queue did not empty enough during the given | 511 | if the queue limit was met, and the queue did not empty enough during the given |
| 513 | timeout. | 512 | timeout. |
| 514 | </p><p> | 513 | </p><p> |
| 515 | Equally, <tt>receive</tt> returns a value and the key that provided the value, | 514 | Equally, <tt>receive</tt> returns a value and the key that provided the value, |
| 516 | or nothing for timeout. Note that <tt>nil</tt>s can be sent and received; | 515 | or nothing for timeout. Note that <tt>nil</tt>s can be sent and received; |
| 517 | the <tt>key</tt> value will tell it apart from a timeout. | 516 | the <tt>key</tt> value will tell it apart from a timeout. |
| 518 | </p><p> | 517 | </p><p> |
| @@ -537,8 +536,8 @@ be used for making priority queues. | |||
| 537 | The table access methods are for accessing a slot without queuing or consuming. | 536 | The table access methods are for accessing a slot without queuing or consuming. |
| 538 | They can be used for making shared tables of storage among the lanes. | 537 | They can be used for making shared tables of storage among the lanes. |
| 539 | </p><p> | 538 | </p><p> |
| 540 | Writing to a slot overwrites existing value, and clears any possible queued | 539 | Writing to a slot overwrites existing value, and clears any possible queued |
| 541 | entries. Table access and <tt>send</tt>/<tt>receive</tt> can be used together; | 540 | entries. Table access and <tt>send</tt>/<tt>receive</tt> can be used together; |
| 542 | reading a slot essentially peeks the next outcoming value of a queue. | 541 | reading a slot essentially peeks the next outcoming value of a queue. |
| 543 | </p> | 542 | </p> |
| 544 | 543 | ||
| @@ -554,7 +553,7 @@ discussing it is good for a preview of how deep userdata works. | |||
| 554 | Because proxy objects (<tt>linda_h</tt>) are just pointers to the real, deep | 553 | Because proxy objects (<tt>linda_h</tt>) are just pointers to the real, deep |
| 555 | userdata, they cannot be used to identify a certain Linda from the others. | 554 | userdata, they cannot be used to identify a certain Linda from the others. |
| 556 | The internal timer system needs to do this, and the <tt>:deep()</tt> method | 555 | The internal timer system needs to do this, and the <tt>:deep()</tt> method |
| 557 | has been added for its use. It returns a light userdata pointing to the | 556 | has been added for its use. It returns a light userdata pointing to the |
| 558 | <i>actual</i> deep object, and thus can be used for seeing, which proxies actually | 557 | <i>actual</i> deep object, and thus can be used for seeing, which proxies actually |
| 559 | mean the same underlying object. You might or might not need a similar system | 558 | mean the same underlying object. You might or might not need a similar system |
| 560 | with your own deep userdata. | 559 | with your own deep userdata. |
| @@ -574,13 +573,13 @@ you want to use several? | |||
| 574 | for the other. This keeps your code clear and readable. You can pass | 573 | for the other. This keeps your code clear and readable. You can pass |
| 575 | multiple Linda handles to a lane with practically no added cost. | 574 | multiple Linda handles to a lane with practically no added cost. |
| 576 | </li> | 575 | </li> |
| 577 | 576 | ||
| 578 | <li>Namespace control. Linda keys have a "flat" namespace, so collisions | 577 | <li>Namespace control. Linda keys have a "flat" namespace, so collisions |
| 579 | are possible if you try to use the same Linda for too many separate uses. | 578 | are possible if you try to use the same Linda for too many separate uses. |
| 580 | </li> | 579 | </li> |
| 581 | 580 | ||
| 582 | <li>Performance. Changing any slot in a Linda causes all pending threads | 581 | <li>Performance. Changing any slot in a Linda causes all pending threads |
| 583 | for that Linda to be momentarily awakened (at least in the C level). | 582 | for that Linda to be momentarily awakened (at least in the C level). |
| 584 | This can degrade performance due to unnecessary OS level context switches. | 583 | This can degrade performance due to unnecessary OS level context switches. |
| 585 | </li> | 584 | </li> |
| 586 | </ul> | 585 | </ul> |
| @@ -603,13 +602,13 @@ events to a common Linda, but... :).</font> | |||
| 603 | </table> | 602 | </table> |
| 604 | 603 | ||
| 605 | <p> | 604 | <p> |
| 606 | Timers can be run once, or in a reoccurring fashion (<tt>period_secs > 0</tt>). | 605 | Timers can be run once, or in a reoccurring fashion (<tt>period_secs > 0</tt>). |
| 607 | The first occurrence can be given either as a date or as a relative delay in seconds. | 606 | The first occurrence can be given either as a date or as a relative delay in seconds. |
| 608 | The <tt>date</tt> table is like what <tt>os.date("*t")</tt> returns, in the | 607 | The <tt>date</tt> table is like what <tt>os.date("*t")</tt> returns, in the |
| 609 | local time zone. | 608 | local time zone. |
| 610 | </p><p> | 609 | </p><p> |
| 611 | Once a timer expires, the <tt>key</tt> is set with the current time | 610 | Once a timer expires, the <tt>key</tt> is set with the current time |
| 612 | (in seconds, same offset as <tt>os.time()</tt> but with millisecond accuracy). | 611 | (in seconds, same offset as <tt>os.time()</tt> but with millisecond accuracy). |
| 613 | The key can be waited upon using the regular Linda <tt>:receive()</tt> | 612 | The key can be waited upon using the regular Linda <tt>:receive()</tt> |
| 614 | method. | 613 | method. |
| 615 | </p><p> | 614 | </p><p> |
| @@ -632,17 +631,17 @@ A timer can be stopped simply by <tt>first_secs=0</tt> and no period. | |||
| 632 | t.sec= 0 | 631 | t.sec= 0 |
| 633 | 632 | ||
| 634 | lanes.timer( linda, "min", t, 60 ) -- reoccur every minute (sharp) | 633 | lanes.timer( linda, "min", t, 60 ) -- reoccur every minute (sharp) |
| 635 | 634 | ||
| 636 | while true do | 635 | while true do |
| 637 | local v,key= linda:receive( "sec", "min" ) | 636 | local v,key= linda:receive( "sec", "min" ) |
| 638 | print( "Timer "..key..": "..v ) | 637 | print( "Timer "..key..": "..v ) |
| 639 | end | 638 | end |
| 640 | </pre> | 639 | </pre> |
| 641 | </table> | 640 | </table> |
| 642 | 641 | ||
| 643 | </p><p> | 642 | </p><p> |
| 644 | NOTE: Timer keys are set, not queued, so missing a beat is possible especially | 643 | NOTE: Timer keys are set, not queued, so missing a beat is possible especially |
| 645 | if the timer cycle is extremely small. The key value can be used to know the | 644 | if the timer cycle is extremely small. The key value can be used to know the |
| 646 | actual time passed. | 645 | actual time passed. |
| 647 | </p><p> | 646 | </p><p> |
| 648 | <table> | 647 | <table> |
| @@ -704,7 +703,7 @@ Similar sugar exists for atomic counters: | |||
| 704 | </table> | 703 | </table> |
| 705 | </p><p> | 704 | </p><p> |
| 706 | 705 | ||
| 707 | Each time called, the generated function will change <tt>linda[key]</tt> | 706 | Each time called, the generated function will change <tt>linda[key]</tt> |
| 708 | atomically, without other lanes being able to interfere. The new value is | 707 | atomically, without other lanes being able to interfere. The new value is |
| 709 | returned. You can use either <tt>diff 0.0</tt> or <tt>get</tt> to just read the current | 708 | returned. You can use either <tt>diff 0.0</tt> or <tt>get</tt> to just read the current |
| 710 | value. | 709 | value. |
| @@ -725,7 +724,7 @@ Note that the generated functions can be passed on to other lanes. | |||
| 725 | <p><ul> | 724 | <p><ul> |
| 726 | <li>Booleans, numbers, strings, light userdata, Lua functions and tables of such can always be passed. | 725 | <li>Booleans, numbers, strings, light userdata, Lua functions and tables of such can always be passed. |
| 727 | </li> | 726 | </li> |
| 728 | <li>Cyclic tables and/or duplicate references are allowed and reproduced appropriately, | 727 | <li>Cyclic tables and/or duplicate references are allowed and reproduced appropriately, |
| 729 | but only <u>within the same transmission</u>. | 728 | but only <u>within the same transmission</u>. |
| 730 | <ul> | 729 | <ul> |
| 731 | <li>using the same source table in multiple Linda messages keeps no ties between the tables | 730 | <li>using the same source table in multiple Linda messages keeps no ties between the tables |
| @@ -777,14 +776,14 @@ should be covered into a one-time-only construct such as below. | |||
| 777 | int luaopen_module( lua_State *L ) | 776 | int luaopen_module( lua_State *L ) |
| 778 | { | 777 | { |
| 779 | static char been_here; /* 0 by ANSI C */ | 778 | static char been_here; /* 0 by ANSI C */ |
| 780 | 779 | ||
| 781 | /* Calls to 'require' serialized by Lanes; this is safe. | 780 | /* Calls to 'require' serialized by Lanes; this is safe. |
| 782 | */ | 781 | */ |
| 783 | if (!been_here) { | 782 | if (!been_here) { |
| 784 | been_here= 1; | 783 | been_here= 1; |
| 785 | ... one time initializations ... | 784 | ... one time initializations ... |
| 786 | } | 785 | } |
| 787 | 786 | ||
| 788 | ... binding to Lua ... | 787 | ... binding to Lua ... |
| 789 | } | 788 | } |
| 790 | </pre> | 789 | </pre> |
| @@ -804,8 +803,9 @@ used for creation and deletion of your deep userdata (the shared resource), | |||
| 804 | and for making metatables for the state-specific proxies for accessing it. | 803 | and for making metatables for the state-specific proxies for accessing it. |
| 805 | Take a look at <tt>linda_id</tt> in <tt>lanes.c</tt>. | 804 | Take a look at <tt>linda_id</tt> in <tt>lanes.c</tt>. |
| 806 | </li> | 805 | </li> |
| 807 | <li>Create your userdata using <tt>luaG_deep_userdata()</tt>, which is | 806 | <li>Instanciate your userdata using <tt>luaG_deep_userdata()</tt>, |
| 808 | a Lua-callable function. Given an <tt>idfunc</tt>, it sets up the support | 807 | instead of the regular <tt>lua_newuserdata()</tt>. |
| 808 | Given an <tt>idfunc</tt>, it sets up the support | ||
| 809 | structures and returns a state-specific proxy userdata for accessing your | 809 | structures and returns a state-specific proxy userdata for accessing your |
| 810 | data. This proxy can also be copied over to other lanes. | 810 | data. This proxy can also be copied over to other lanes. |
| 811 | </li> | 811 | </li> |
| @@ -815,7 +815,7 @@ Take a look at <tt>linda_id</tt> in <tt>lanes.c</tt>. | |||
| 815 | </ol> | 815 | </ol> |
| 816 | 816 | ||
| 817 | <p>Deep userdata management will take care of tying to <tt>__gc</tt> methods, | 817 | <p>Deep userdata management will take care of tying to <tt>__gc</tt> methods, |
| 818 | and doing reference counting to see how many proxies are still there for | 818 | and doing reference counting to see how many proxies are still there for |
| 819 | accessing the data. Once there are none, the data will be freed through a call | 819 | accessing the data. Once there are none, the data will be freed through a call |
| 820 | to the <tt>idfunc</tt> you provided. | 820 | to the <tt>idfunc</tt> you provided. |
| 821 | </p> | 821 | </p> |
| @@ -850,7 +850,7 @@ something like this: | |||
| 850 | <pre> | 850 | <pre> |
| 851 | A: print( 1, 2, 3, 4 ) | 851 | A: print( 1, 2, 3, 4 ) |
| 852 | B: print( 'a', 'b', 'c', 'd' ) | 852 | B: print( 'a', 'b', 'c', 'd' ) |
| 853 | 853 | ||
| 854 | 1 a b 2 3 c d 4 | 854 | 1 a b 2 3 c d 4 |
| 855 | </pre> | 855 | </pre> |
| 856 | 856 | ||
| @@ -870,7 +870,7 @@ Here are some things one should consider, if best performance is vital: | |||
| 870 | <ul> | 870 | <ul> |
| 871 | <li>Data passing (parameters, upvalues, Linda messages) is generally fast, | 871 | <li>Data passing (parameters, upvalues, Linda messages) is generally fast, |
| 872 | doing two binary state-to-state copies (from source state to hidden state, | 872 | doing two binary state-to-state copies (from source state to hidden state, |
| 873 | hidden state to target state). Remember that not only the function you | 873 | hidden state to target state). Remember that not only the function you |
| 874 | specify but also its upvalues, their upvalues, etc. etc. will get copied. | 874 | specify but also its upvalues, their upvalues, etc. etc. will get copied. |
| 875 | </li> | 875 | </li> |
| 876 | <li>Lane startup is fast (1000's of lanes a second), depending on the | 876 | <li>Lane startup is fast (1000's of lanes a second), depending on the |
| @@ -894,7 +894,7 @@ Here are some things one should consider, if best performance is vital: | |||
| 894 | merged into one main timer state (see <tt>timer.lua</tt>); no OS side | 894 | merged into one main timer state (see <tt>timer.lua</tt>); no OS side |
| 895 | timers are utilized. | 895 | timers are utilized. |
| 896 | </li> | 896 | </li> |
| 897 | <li>Lindas are hashed to a fixed number of "keeper states", which are a locking entity. | 897 | <li>Lindas are hashed to a fixed number of "keeper states", which are a locking entity. |
| 898 | If you are using a lot of Linda objects, | 898 | If you are using a lot of Linda objects, |
| 899 | it may be useful to try having more of these keeper states. By default, | 899 | it may be useful to try having more of these keeper states. By default, |
| 900 | only one is used (see <tt>KEEPER_STATES_N</tt>), but this is an implementation detail. | 900 | only one is used (see <tt>KEEPER_STATES_N</tt>), but this is an implementation detail. |
| @@ -907,7 +907,7 @@ Here are some things one should consider, if best performance is vital: | |||
| 907 | 907 | ||
| 908 | <p> | 908 | <p> |
| 909 | Cancellation of lanes uses the Lua error mechanism with a special lightuserdata | 909 | Cancellation of lanes uses the Lua error mechanism with a special lightuserdata |
| 910 | error sentinel. | 910 | error sentinel. |
| 911 | If you use <tt>pcall</tt> in code that needs to be cancellable | 911 | If you use <tt>pcall</tt> in code that needs to be cancellable |
| 912 | from the outside, the special error might not get through to Lanes, thus | 912 | from the outside, the special error might not get through to Lanes, thus |
| 913 | preventing the Lane from being cleanly cancelled. You should throw any | 913 | preventing the Lane from being cleanly cancelled. You should throw any |
| @@ -929,6 +929,13 @@ its actual value. | |||
| 929 | <h2 id="changes">Change log</h2> | 929 | <h2 id="changes">Change log</h2> |
| 930 | 930 | ||
| 931 | <p> | 931 | <p> |
| 932 | Feb-2011 (2.0.11): | ||
| 933 | <ul> | ||
| 934 | <li>Fixed bug where reference to Linda object was dropped for a short time (crashing if GC was run during that time).</li> | ||
| 935 | <li>Changed the atexit code to trip the timer thread's write signal.</li> | ||
| 936 | <li>Changed lanes.c to export functions as a module rather than writing them directly to the globals table.</li> | ||
| 937 | </ul> | ||
| 938 | |||
| 932 | Jan-2011 (2.0.10): | 939 | Jan-2011 (2.0.10): |
| 933 | <ul> | 940 | <ul> |
| 934 | <li>linda_send was waiting on the wrong signal</li> | 941 | <li>linda_send was waiting on the wrong signal</li> |
