lua-users home
lua-l archive

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


Thanks for the reply, i found several patches to make lua yield and
resume from inside a metamethod. I would see if it is that important
to the project or not.

On 3/13/08, Alex Davies <alex.mania@iinet.net.au> wrote:
> I couldn't fully understand your post, but I think I understand the error
> message and "hook".
>
> Lua can only yield if the C call stack is empty. This means you cannot yield
> from inside a metamethod, eg __index, or from a nested C call, or, in this
> case, from a hook. If you really require this, you need a dedicated C stack
> for all lua threads, eg you need coco. http://luajit.org/coco.html
>
> This solution increases memory usage somewhat. Future versions of jit
> promise a better approach if IIRC.
>
> - Alex
>
> ----- Original Message -----
> From: "Joseph Saadé" <jsaade@gmail.com>
> To: <lua@bazar2.conectiva.com.br>
> Sent: Thursday, March 13, 2008 6:19 PM
> Subject: lua threads resuming and yielding from C
>
>
> > In my game project every entity has a different script running in a
> > new lua thread.
> > Every game loop, the engine calls the function OnUpdate located in every
> > script.
> > I want the ability to pause a script.
> > I implemented that by using a script manager that keeps track if a
> > script is yield.
> > so somthing like this would work:
> >
> > function OnUpdate(dt)
> >  doAI()
> >  Entity.Pause(3)
> >  doAI2()
> > end
> >
> > Entity.Pause is a C hook function that pauses the thread execution
> > using lua_yield.
> > the script engine waits 3 seconds and then calls lua_resume.
> >
> > The function OnUpdate is not called while is script is yielding.
> > my problem is that after the script first resumes, the doAI2() is not
> > called, nothing after the pause command is actually called. and the
> > next call to yield/resume will resolve in an error (yield returns:
> > "attempt to yield across metamethod/c-call boundary")
> >
> > so can't i yield a thread from inside a hook function and resume it's
> > execution normally?
>