lua-users home
lua-l archive

[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