[aquaria] Patch to run Lua scripts as threads

Andrew Church achurch+aquaria at achurch.org
Wed Jul 7 00:18:10 EDT 2010


Well, the way Lua threads work (as I understand it, anyway) is that each
thread is sort of a "lightweight" lua_State, in the sense that when you
create it, it shares the global table of the original lua_State you
created it from.  But it's still a separate state block, so you can set
a new environment table and the thread will then use that instead of the
original.

Since Lua also lets you link tables together using the "index"
metamethod (see under http://www.lua.org/manual/5.1/manual.html#2.8),
you can nest environments by setting the thread environment's index
metamethod to the original global table -- that way the thread can read
from both its own environment and the shared globals, but it can't write
to the shared globals so it won't interfere with any other instances of
the same script.

It looked convenient to me, anyway. (:

  --Andrew Church
    achurch at achurch.org
    http://achurch.org/

>I suppose I don't understand the thread method very well, so that may be
>hampering my ability to see the advantages/disadvantages to either. :)
>
>On Tue, Jul 6, 2010 at 6:59 PM, Andrew Church
><achurch+aquaria at achurch.org<achurch%2Baquaria at achurch.org>
>> wrote:
>
>> Just that it feels really roundabout to me, especially with all the "v."
>> prefixes added to the variables.  As long as we have to set something,
>> why not just set it once when the thread is created?  Then you don't have
>> to worry about updating it later, plus you can use "global" variables in
>> the scripts without worrying about forgetting a "v." somewhere.
>>
>>  --Andrew Church
>>    achurch at achurch.org
>>    http://achurch.org/
>>
>> >What's wrong with setting a global variable before each script function is
>> >called?
>> >
>> >On Tue, Jul 6, 2010 at 6:41 PM, Andrew Church
>> ><achurch+aquaria at achurch.org <achurch%2Baquaria at achurch.org><
>> achurch%2Baquaria at achurch.org <achurch%252Baquaria at achurch.org>>
>> >> wrote:
>> >
>> >> Okay, so I've run into a little problem with this.  I'm not sure what
>> >> approach your friend took, but what I've done so far is put a
>> >> "v = getVars()" at the top of each script, and put "v." in front of all
>> >> local variables.  The problem is that the functions in each script all
>> >> see only a single version of "v", because the getVars() is only executed
>> >> once per script instance.
>> >>
>> >> I guess one way around this would be to add a getVars() call to every
>> >> function, but that feels a bit fragile to me -- too easy to miss one
>> >> somewhere, and you can't even trace the problem easily because it'll
>> >> fall back to the global "v" definition (which you need for initializing
>> >> stuff at the top of the script).
>> >>
>> >> What I did for now was to update "v" with the current instance's
>> variable
>> >> table right before each call into Lua, but that feels like a hack to me;
>> >> if we have to mess with the Lua environment from C, we might as well go
>> >> back to the nested environments I was using before, because at least
>> with
>> >> those you don't have to to a lua_setglobal() on every Lua function call.
>> >>
>> >> I don't know Lua too well, so maybe I'm missing something obvious --
>> >> any other suggestions?
>> >>
>> >>  --Andrew Church
>> >>    achurch at achurch.org
>> >>    http://achurch.org/
>> >>
>> >> >So, one way to change the scripts to use local variables... Based on
>> what
>> >> a
>> >> >friend told me, and the engine he's working on...
>> >> >
>> >> >Instead of creating a lua_State for each script, we create a table.
>> Then
>> >> any
>> >> >script can access it's table... something like
>> >> >
>> >> >v = getVars();
>> >> >
>> >> >then any local variable just has to have "v." added before it.
>> >> >
>> >> >This doesn't sound like a super hard change to make, although it would
>> >> >involve changing all the scripts.
>> >> _______________________________________________
>> >> aquaria mailing list
>> >> aquaria at icculus.org
>> >> http://icculus.org/mailman/listinfo/aquaria
>> >>
>> >
>> >
>> >
>> >--
>> >Alec Holowka
>> >www.infiniteammo.ca
>> >www.bit-blot.com
>> >
>> >--00c09f905f33019b32048ab93b3b
>> >Content-Type: text/html; charset=ISO-8859-1
>> >Content-Transfer-Encoding: quoted-printable
>> >
>> >What&#39;s wrong with setting a global variable before each script
>> function=
>> > is called?<br><br><div class=3D"gmail_quote">On Tue, Jul 6, 2010 at 6:41
>> P=
>> >M, Andrew Church <span dir=3D"ltr">&lt;<a href=3D"mailto:
>> achurch%2Baquaria@ <achurch%252Baquaria@>=
>> >achurch.org">achurch+aquaria at achurch.org <achurch%2Baquaria at achurch.org></a>&gt;</span>
>> wrote:<br>
>> ><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0
>> .8ex;border-left:1p=
>> >x #ccc solid;padding-left:1ex;">Okay, so I&#39;ve run into a little
>> problem=
>> > with this. =A0I&#39;m not sure what<br>
>> >approach your friend took, but what I&#39;ve done so far is put a<br>
>> >&quot;v =3D getVars()&quot; at the top of each script, and put
>> &quot;v.&quo=
>> >t; in front of all<br>
>> >local variables. =A0The problem is that the functions in each script
>> all<br=
>> >>
>> >see only a single version of &quot;v&quot;, because the getVars() is only
>> e=
>> >xecuted<br>
>> >once per script instance.<br>
>> ><br>
>> >I guess one way around this would be to add a getVars() call to every<br>
>> >function, but that feels a bit fragile to me -- too easy to miss one<br>
>> >somewhere, and you can&#39;t even trace the problem easily because
>> it&#39;l=
>> >l<br>
>> >fall back to the global &quot;v&quot; definition (which you need for
>> initia=
>> >lizing<br>
>> >stuff at the top of the script).<br>
>> ><br>
>> >What I did for now was to update &quot;v&quot; with the current
>> instance&#3=
>> >9;s variable<br>
>> >table right before each call into Lua, but that feels like a hack to
>> me;<br=
>> >>
>> >if we have to mess with the Lua environment from C, we might as well
>> go<br>
>> >back to the nested environments I was using before, because at least
>> with<b=
>> >r>
>> >those you don&#39;t have to to a lua_setglobal() on every Lua function
>> call=
>> >.<br>
>> ><br>
>> >I don&#39;t know Lua too well, so maybe I&#39;m missing something obvious
>> -=
>> >-<br>
>> >any other suggestions?<br>
>> ><div class=3D"im"><br>
>> > =A0--Andrew Church<br>
>> > =A0 =A0<a href=3D"mailto:achurch at achurch.org">achurch at achurch.org
>> </a><br>
>> > =A0 =A0<a href=3D"http://achurch.org/" target=3D"_blank">
>> http://achurch.or=
>> >g/</a><br>
>> ><br>
>> ></div><div class=3D"im">&gt;So, one way to change the scripts to use local
>> =
>> >variables... Based on what a<br>
>> >&gt;friend told me, and the engine he&#39;s working on...<br>
>> >&gt;<br>
>> >&gt;Instead of creating a lua_State for each script, we create a table.
>> The=
>> >n any<br>
>> >&gt;script can access it&#39;s table... something like<br>
>> >&gt;<br>
>> >&gt;v =3D getVars();<br>
>> >&gt;<br>
>> >&gt;then any local variable just has to have &quot;v.&quot; added before
>> it=
>> >.<br>
>> >&gt;<br>
>> >&gt;This doesn&#39;t sound like a super hard change to make, although it
>> wo=
>> >uld<br>
>> >&gt;involve changing all the scripts.<br>
>> ></div><div><div></div><div
>> class=3D"h5">___________________________________=
>> >____________<br>
>> >aquaria mailing list<br>
>> ><a href=3D"mailto:aquaria at icculus.org">aquaria at icculus.org</a><br>
>> ><a href=3D"http://icculus.org/mailman/listinfo/aquaria"
>> target=3D"_blank">h=
>> >ttp://icculus.org/mailman/listinfo/aquaria</a><br>
>> ></div></div></blockquote></div><br><br clear=3D"all"><br>-- <br>Alec
>> Holowk=
>> >a<br><a href=3D"http://www.infiniteammo.ca">www.infiniteammo.ca</a><br><a
>> h=
>> >ref=3D"http://www.bit-blot.com">www.bit-blot.com</a><br>
>> >
>> >--00c09f905f33019b32048ab93b3b--
>> >
>> >--===============8316068614339074354==
>> >Content-Type: text/plain; charset="us-ascii"
>> >MIME-Version: 1.0
>> >Content-Transfer-Encoding: 7bit
>> >Content-Disposition: inline
>> >
>> >_______________________________________________
>> >aquaria mailing list
>> >aquaria at icculus.org
>> >http://icculus.org/mailman/listinfo/aquaria
>> >
>> >--===============8316068614339074354==--
>> _______________________________________________
>> aquaria mailing list
>> aquaria at icculus.org
>> http://icculus.org/mailman/listinfo/aquaria
>>
>
>
>
>-- 
>Alec Holowka
>www.infiniteammo.ca
>www.bit-blot.com
>
>--00c09f89962c2be062048ab96a57
>Content-Type: text/html; charset=ISO-8859-1
>Content-Transfer-Encoding: quoted-printable
>
>I suppose I don&#39;t understand the thread method very well, so that may b=
>e hampering my ability to see the advantages/disadvantages to either. :)<br=
>><br><div class=3D"gmail_quote">On Tue, Jul 6, 2010 at 6:59 PM, Andrew Chur=
>ch <span dir=3D"ltr">&lt;<a href=3D"mailto:achurch%2Baquaria at achurch.org">a=
>church+aquaria at achurch.org</a>&gt;</span> wrote:<br>
><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
>x #ccc solid;padding-left:1ex;">Just that it feels really roundabout to me,=
> especially with all the &quot;v.&quot;<br>
>prefixes added to the variables. =A0As long as we have to set something,<br=
>>
>why not just set it once when the thread is created? =A0Then you don&#39;t =
>have<br>
>to worry about updating it later, plus you can use &quot;global&quot; varia=
>bles in<br>
>the scripts without worrying about forgetting a &quot;v.&quot; somewhere.<b=
>r>
><div class=3D"im"><br>
> =A0--Andrew Church<br>
> =A0 =A0<a href=3D"mailto:achurch at achurch.org">achurch at achurch.org</a><br>
> =A0 =A0<a href=3D"http://achurch.org/" target=3D"_blank">http://achurch.or=
>g/</a><br>
><br>
></div><div class=3D"im">&gt;What&#39;s wrong with setting a global variable=
> before each script function is<br>
>&gt;called?<br>
>&gt;<br>
>&gt;On Tue, Jul 6, 2010 at 6:41 PM, Andrew Church<br>
></div>&gt;&lt;<a href=3D"mailto:achurch%2Baquaria at achurch.org">achurch+aqua=
>ria at achurch.org</a>&lt;<a href=3D"mailto:achurch%252Baquaria at achurch.org">a=
>church%2Baquaria at achurch.org</a>&gt;<br>
><div><div></div><div class=3D"h5">&gt;&gt; wrote:<br>
>&gt;<br>
>&gt;&gt; Okay, so I&#39;ve run into a little problem with this. =A0I&#39;m =
>not sure what<br>
>&gt;&gt; approach your friend took, but what I&#39;ve done so far is put a<=
>br>
>&gt;&gt; &quot;v =3D getVars()&quot; at the top of each script, and put &qu=
>ot;v.&quot; in front of all<br>
>&gt;&gt; local variables. =A0The problem is that the functions in each scri=
>pt all<br>
>&gt;&gt; see only a single version of &quot;v&quot;, because the getVars() =
>is only executed<br>
>&gt;&gt; once per script instance.<br>
>&gt;&gt;<br>
>&gt;&gt; I guess one way around this would be to add a getVars() call to ev=
>ery<br>
>&gt;&gt; function, but that feels a bit fragile to me -- too easy to miss o=
>ne<br>
>&gt;&gt; somewhere, and you can&#39;t even trace the problem easily because=
> it&#39;ll<br>
>&gt;&gt; fall back to the global &quot;v&quot; definition (which you need f=
>or initializing<br>
>&gt;&gt; stuff at the top of the script).<br>
>&gt;&gt;<br>
>&gt;&gt; What I did for now was to update &quot;v&quot; with the current in=
>stance&#39;s variable<br>
>&gt;&gt; table right before each call into Lua, but that feels like a hack =
>to me;<br>
>&gt;&gt; if we have to mess with the Lua environment from C, we might as we=
>ll go<br>
>&gt;&gt; back to the nested environments I was using before, because at lea=
>st with<br>
>&gt;&gt; those you don&#39;t have to to a lua_setglobal() on every Lua func=
>tion call.<br>
>&gt;&gt;<br>
>&gt;&gt; I don&#39;t know Lua too well, so maybe I&#39;m missing something =
>obvious --<br>
>&gt;&gt; any other suggestions?<br>
>&gt;&gt;<br>
>&gt;&gt; =A0--Andrew Church<br>
>&gt;&gt; =A0 =A0<a href=3D"mailto:achurch at achurch.org">achurch at achurch.org<=
>/a><br>
>&gt;&gt; =A0 =A0<a href=3D"http://achurch.org/" target=3D"_blank">http://ac=
>hurch.org/</a><br>
>&gt;&gt;<br>
>&gt;&gt; &gt;So, one way to change the scripts to use local variables... Ba=
>sed on what<br>
>&gt;&gt; a<br>
>&gt;&gt; &gt;friend told me, and the engine he&#39;s working on...<br>
>&gt;&gt; &gt;<br>
>&gt;&gt; &gt;Instead of creating a lua_State for each script, we create a t=
>able. Then<br>
>&gt;&gt; any<br>
>&gt;&gt; &gt;script can access it&#39;s table... something like<br>
>&gt;&gt; &gt;<br>
>&gt;&gt; &gt;v =3D getVars();<br>
>&gt;&gt; &gt;<br>
>&gt;&gt; &gt;then any local variable just has to have &quot;v.&quot; added =
>before it.<br>
>&gt;&gt; &gt;<br>
>&gt;&gt; &gt;This doesn&#39;t sound like a super hard change to make, altho=
>ugh it would<br>
>&gt;&gt; &gt;involve changing all the scripts.<br>
>&gt;&gt; _______________________________________________<br>
>&gt;&gt; aquaria mailing list<br>
>&gt;&gt; <a href=3D"mailto:aquaria at icculus.org">aquaria at icculus.org</a><br>
>&gt;&gt; <a href=3D"http://icculus.org/mailman/listinfo/aquaria" target=3D"=
>_blank">http://icculus.org/mailman/listinfo/aquaria</a><br>
>&gt;&gt;<br>
>&gt;<br>
>&gt;<br>
>&gt;<br>
>&gt;--<br>
>&gt;Alec Holowka<br>
>&gt;<a href=3D"http://www.infiniteammo.ca" target=3D"_blank">www.infiniteam=
>mo.ca</a><br>
>&gt;<a href=3D"http://www.bit-blot.com" target=3D"_blank">www.bit-blot.com<=
>/a><br>
>&gt;<br>
></div></div>&gt;--00c09f905f33019b32048ab93b3b<br>
><div class=3D"im">&gt;Content-Type: text/html; charset=3DISO-8859-1<br>
>&gt;Content-Transfer-Encoding: quoted-printable<br>
>&gt;<br>
></div>&gt;What&amp;#39;s wrong with setting a global variable before each s=
>cript function=3D<br>
>&gt; is called?&lt;br&gt;&lt;br&gt;&lt;div class=3D3D&quot;gmail_quote&quot=
>;&gt;On Tue, Jul 6, 2010 at 6:41 P=3D<br>
>&gt;M, Andrew Church &lt;span dir=3D3D&quot;ltr&quot;&gt;&amp;lt;&lt;a href=
>=3D3D&quot;mailto:<a href=3D"mailto:achurch%252Baquaria@">achurch%2Baquaria=
>@</a>=3D<br>
><div class=3D"im">&gt;<a href=3D"http://achurch.org" target=3D"_blank">achu=
>rch.org</a>&quot;&gt;<a href=3D"mailto:achurch%2Baquaria at achurch.org">achur=
>ch+aquaria at achurch.org</a>&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;br&gt;<=
>br>
>
></div>&gt;&lt;blockquote class=3D3D&quot;gmail_quote&quot; style=3D3D&quot;=
>margin:0 0 0 .8ex;border-left:1p=3D<br>
>&gt;x #ccc solid;padding-left:1ex;&quot;&gt;Okay, so I&amp;#39;ve run into =
>a little problem=3D<br>
>&gt; with this. =3DA0I&amp;#39;m not sure what&lt;br&gt;<br>
>&gt;approach your friend took, but what I&amp;#39;ve done so far is put a&l=
>t;br&gt;<br>
>&gt;&amp;quot;v =3D3D getVars()&amp;quot; at the top of each script, and pu=
>t &amp;quot;v.&amp;quo=3D<br>
>&gt;t; in front of all&lt;br&gt;<br>
>&gt;local variables. =3DA0The problem is that the functions in each script =
>all&lt;br=3D<br>
>&gt;&gt;<br>
>&gt;see only a single version of &amp;quot;v&amp;quot;, because the getVars=
>() is only e=3D<br>
>&gt;xecuted&lt;br&gt;<br>
>&gt;once per script instance.&lt;br&gt;<br>
>&gt;&lt;br&gt;<br>
>&gt;I guess one way around this would be to add a getVars() call to every&l=
>t;br&gt;<br>
>&gt;function, but that feels a bit fragile to me -- too easy to miss one&lt=
>;br&gt;<br>
>&gt;somewhere, and you can&amp;#39;t even trace the problem easily because =
>it&amp;#39;l=3D<br>
>&gt;l&lt;br&gt;<br>
>&gt;fall back to the global &amp;quot;v&amp;quot; definition (which you nee=
>d for initia=3D<br>
>&gt;lizing&lt;br&gt;<br>
>&gt;stuff at the top of the script).&lt;br&gt;<br>
>&gt;&lt;br&gt;<br>
>&gt;What I did for now was to update &amp;quot;v&amp;quot; with the current=
> instance&amp;#3=3D<br>
>&gt;9;s variable&lt;br&gt;<br>
>&gt;table right before each call into Lua, but that feels like a hack to me=
>;&lt;br=3D<br>
>&gt;&gt;<br>
>&gt;if we have to mess with the Lua environment from C, we might as well go=
>&lt;br&gt;<br>
>&gt;back to the nested environments I was using before, because at least wi=
>th&lt;b=3D<br>
>&gt;r&gt;<br>
>&gt;those you don&amp;#39;t have to to a lua_setglobal() on every Lua funct=
>ion call=3D<br>
>&gt;.&lt;br&gt;<br>
>&gt;&lt;br&gt;<br>
>&gt;I don&amp;#39;t know Lua too well, so maybe I&amp;#39;m missing somethi=
>ng obvious -=3D<br>
>&gt;-&lt;br&gt;<br>
>&gt;any other suggestions?&lt;br&gt;<br>
>&gt;&lt;div class=3D3D&quot;im&quot;&gt;&lt;br&gt;<br>
><div class=3D"im">&gt; =3DA0--Andrew Church&lt;br&gt;<br>
>&gt; =3DA0 =3DA0&lt;a href=3D3D&quot;mailto:<a href=3D"mailto:achurch at achur=
>ch.org">achurch at achurch.org</a>&quot;&gt;<a href=3D"mailto:achurch at achurch.=
>org">achurch at achurch.org</a>&lt;/a&gt;&lt;br&gt;<br>
>&gt; =3DA0 =3DA0&lt;a href=3D3D&quot;<a href=3D"http://achurch.org/" target=
>=3D"_blank">http://achurch.org/</a>&quot; target=3D3D&quot;_blank&quot;&gt;=
><a href=3D"http://achurch.or" target=3D"_blank">http://achurch.or</a>=3D<br=
>>
>&gt;g/&lt;/a&gt;&lt;br&gt;<br>
>&gt;&lt;br&gt;<br>
></div>&gt;&lt;/div&gt;&lt;div class=3D3D&quot;im&quot;&gt;&amp;gt;So, one w=
>ay to change the scripts to use local =3D<br>
>&gt;variables... Based on what a&lt;br&gt;<br>
>&gt;&amp;gt;friend told me, and the engine he&amp;#39;s working on...&lt;br=
>&gt;<br>
>&gt;&amp;gt;&lt;br&gt;<br>
>&gt;&amp;gt;Instead of creating a lua_State for each script, we create a ta=
>ble. The=3D<br>
>&gt;n any&lt;br&gt;<br>
>&gt;&amp;gt;script can access it&amp;#39;s table... something like&lt;br&gt=
>;<br>
>&gt;&amp;gt;&lt;br&gt;<br>
>&gt;&amp;gt;v =3D3D getVars();&lt;br&gt;<br>
>&gt;&amp;gt;&lt;br&gt;<br>
>&gt;&amp;gt;then any local variable just has to have &amp;quot;v.&amp;quot;=
> added before it=3D<br>
>&gt;.&lt;br&gt;<br>
>&gt;&amp;gt;&lt;br&gt;<br>
>&gt;&amp;gt;This doesn&amp;#39;t sound like a super hard change to make, al=
>though it wo=3D<br>
>&gt;uld&lt;br&gt;<br>
>&gt;&amp;gt;involve changing all the scripts.&lt;br&gt;<br>
>&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class=3D3D&quot;h=
>5&quot;&gt;___________________________________=3D<br>
><div class=3D"im">&gt;____________&lt;br&gt;<br>
>&gt;aquaria mailing list&lt;br&gt;<br>
>&gt;&lt;a href=3D3D&quot;mailto:<a href=3D"mailto:aquaria at icculus.org">aqua=
>ria at icculus.org</a>&quot;&gt;<a href=3D"mailto:aquaria at icculus.org">aquaria=
>@icculus.org</a>&lt;/a&gt;&lt;br&gt;<br>
>&gt;&lt;a href=3D3D&quot;<a href=3D"http://icculus.org/mailman/listinfo/aqu=
>aria" target=3D"_blank">http://icculus.org/mailman/listinfo/aquaria</a>&quo=
>t; target=3D3D&quot;_blank&quot;&gt;h=3D<br>
></div>&gt;ttp://<a href=3D"http://icculus.org/mailman/listinfo/aquaria" tar=
>get=3D"_blank">icculus.org/mailman/listinfo/aquaria</a>&lt;/a&gt;&lt;br&gt;=
><br>
>&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br=
> clear=3D3D&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Alec Holowk=3D<br>
>&gt;a&lt;br&gt;&lt;a href=3D3D&quot;<a href=3D"http://www.infiniteammo.ca" =
>target=3D"_blank">http://www.infiniteammo.ca</a>&quot;&gt;<a href=3D"http:/=
>/www.infiniteammo.ca" target=3D"_blank">www.infiniteammo.ca</a>&lt;/a&gt;&l=
>t;br&gt;&lt;a h=3D<br>
>
><div class=3D"im">&gt;ref=3D3D&quot;<a href=3D"http://www.bit-blot.com" tar=
>get=3D"_blank">http://www.bit-blot.com</a>&quot;&gt;<a href=3D"http://www.b=
>it-blot.com" target=3D"_blank">www.bit-blot.com</a>&lt;/a&gt;&lt;br&gt;<br>
>&gt;<br>
></div>&gt;--00c09f905f33019b32048ab93b3b--<br>
>&gt;<br>
>&gt;--=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D8316068614339074354=3D=
>=3D<br>
><div class=3D"im">&gt;Content-Type: text/plain; charset=3D&quot;us-ascii&qu=
>ot;<br>
>&gt;MIME-Version: 1.0<br>
>&gt;Content-Transfer-Encoding: 7bit<br>
>&gt;Content-Disposition: inline<br>
>&gt;<br>
>&gt;_______________________________________________<br>
></div><div class=3D"im">&gt;aquaria mailing list<br>
>&gt;<a href=3D"mailto:aquaria at icculus.org">aquaria at icculus.org</a><br>
>&gt;<a href=3D"http://icculus.org/mailman/listinfo/aquaria" target=3D"_blan=
>k">http://icculus.org/mailman/listinfo/aquaria</a><br>
>&gt;<br>
></div>&gt;--=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D831606861433907435=
>4=3D=3D--<br>
><div><div></div><div class=3D"h5">_________________________________________=
>______<br>
>aquaria mailing list<br>
><a href=3D"mailto:aquaria at icculus.org">aquaria at icculus.org</a><br>
><a href=3D"http://icculus.org/mailman/listinfo/aquaria" target=3D"_blank">h=
>ttp://icculus.org/mailman/listinfo/aquaria</a><br>
></div></div></blockquote></div><br><br clear=3D"all"><br>-- <br>Alec Holowk=
>a<br><a href=3D"http://www.infiniteammo.ca">www.infiniteammo.ca</a><br><a h=
>ref=3D"http://www.bit-blot.com">www.bit-blot.com</a><br>
>
>--00c09f89962c2be062048ab96a57--
>
>--===============8912212090960536604==
>Content-Type: text/plain; charset="us-ascii"
>MIME-Version: 1.0
>Content-Transfer-Encoding: 7bit
>Content-Disposition: inline
>
>_______________________________________________
>aquaria mailing list
>aquaria at icculus.org
>http://icculus.org/mailman/listinfo/aquaria
>
>--===============8912212090960536604==--


More information about the aquaria mailing list