[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: lua threads resuming and yielding from C
- From: "Joseph Saadé" <jsaade@...>
- Date: Thu, 13 Mar 2008 04:35:58 -0800
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 <email@example.com> 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é" <firstname.lastname@example.org>
> To: <email@example.com>
> 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?