lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

> > Hi all,
> >
> > I've been using lua for some time as an embedded scripting language.
> The
> > implementation was a pre-emptive multitasking environment. I now have
> the
> > intention to do some lua-only developments and have been looking into
> the
> > cooperative multitasking model.
> >
> > The basics are very clear, but there is one part that I feel
> uncomfortable
> > with; How often and when would I have to yield? Are there any
> guidelines on
> > that?
>   I implemented a cooperative scheduler in C/Lua based around a
> homebrewed
> network API.  Basically, when ever I read from a socket, I would yield,
> and
> possibly with socket writes as well (for instance, I wanted to write
> 8k, but
> only 1k was accepted, yield until I can write to that socket again).  I
> didn't bother with trying to ensure arbitrary code would yield properly
> as I
> was the only one writing the code.
>   The C code was event driven (using epoll() under Linux).  The Lua
> code is
> nice---for instance, an echo service:
> 	-- When a TCP connection is accepted, a Lua coroutine is created
> and
> 	-- a function called "main()" in the script is called.  Any calls
> 	-- through the "socket" object can block, causing another Lua
> 	-- "thread" to run.
> 	function main(socket)
> 	  while true do
> 	    socket:write(socket:read("*a"))
> 	  end
> 	end
>   The C code ... isn't quite so straight forward.

I'm looking at lua for the cross platform support mac, win, linux, etc. with
ultimately also embedded linux (wlan routers, nas devices, etc.) So I want
to stick to only cross platform stuff and hence choose luasockets.

> > In general my understanding is that not yielding for too long, will
> make
> > other threads unresponsive, that's obvious. But I intent do use
> luasockets
> > and maybe some RS232 serial stuff, so that's where my concerns are;
> loosing
> > incoming data on those IO channels because another thread doesn't
> yield in
> > time.
>   It's up to the programmer writing the scripts to properly yield---if
> you
> want to enfore this (and don't trust the programmer), you need
> preemption,
> period.

That's clear. No problem, I intend to write the code myself, so that
shouldn't be an issue. Also I want it to use cooperative, as a learning
experience (I have had my share of race conditions, deadlocks and the like).

>   But, like I said, decent places to call yield() behind the scenes
> include
> places that normally block, like network or serial communication.
> > The google mainly returned long debates on preemptive vs cooperative,
> but no
> > info on how to make it work best.
>   Cooperative multitasking is actually very simple---just yield to
> another
> thread.  When to do that, is the not-so-easy part.

And that's exactly my main question... 

>   -spc (If you like, I can provide what I have, although it's mostly
> 	undocumented ... )

Thx Sean for your kind (and elaborate) reply