lua-users home
lua-l archive

RE: Running a script in each Lua thread.

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


A C function can only call lua_yield() in its return statement:
return lua_yield( L, nresults );
So you shouldn't really be trying to resume/yield C functions, rather
you should be resuming/yielding lua functions. It's prefectly
reasonable, however, for a resumed lua function to call a C function
that yields.
If you want to resume a lua function different than the one that yielded
you have to create a new thread (that's how coroutines work).
You could, perhaps, instead of switching to a different function, pass a
parameter to resume that would tell the resumed function what to do
next. The parameter could be a function to call.
You could use tail calls to avoid deep stacks:
function funcA()
 print( "funcA" )
 local nextfunc = coroutine.yield( funcB )
 return nextfunc()
end
function funcB()
 print( "funcB" )
 local nextfunc = coroutine.yield( funcA )
 return nextfunc()
end
> co = coroutine.wrap( funcA )
> next = co()
funcA
> next = co( next )
funcB
> next = co( next )
funcA
-Kevin
> Kevin,
> 
> Thank you for the follow up. Further to the execution of a 
> specific function, if I have a thread that has called a C 
> function which invokes lua_yield(), is there any way I can 
> get the thread to begin execution of the function from the 
> top of the function body? Eg. The thread goes into a
> Wait() function, waiting for some event, but while waiting 
> for the event, the C code decides the thread should start 
> either the same function over again, or switch to another 
> one. What is the correct syntax for doing this? Currently, 
> calling the doit() function as you've shown below resumes 
> execution of the function body; it doesn't restart it. Do I 
> need to flush the stack somehow, or roll it back somehow? Or 
> do I have to close the thread somehow (since 
> lua_closethread() doesn't exist!) or can I do something to 
> get it executing another function?
> 
> - Steven

AltStyle によって変換されたページ (->オリジナル) /