lua-users home
lua-l archive

RE: About lua_newthread

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


Title: RE: About lua_newthread
My point though was that there is no item of type "thread" on the stack after I create the thread. Lua seems to be saving it on the stack as type userdata. What is even more bizarre (to me), is that if I omit the part where I store the thread as a key in the globals table, then the single item at the point of a deletion comes out as type 'string' and the removal check fails. It seems I have no understanding of the mysteries of the Lua engine :)
It is at this point that I think I would like to support Mos' call for a lua_deletethread() function in the next version :)
Tom
-----Original Message-----
From: lua-bounces@bazar2.conectiva.com.br [mailto:lua-bounces@bazar2.conectiva.com.br]On Behalf Of Jerome Vuarand
Sent: 07 June 2006 21:29
To: Lua list
Subject: RE: About lua_newthread

I think the line you point is the right one. Values are not typed in C API, stack entries are. So if you push a void* as a light user data, it is a light user data for Lua. lua_newthread already pushes the lua_State on the stack as a thread, so you don't need to explicitly do it.


De : lua-bounces@bazar2.conectiva.com.br [mailto:lua-bounces@bazar2.conectiva.com.br] De la part de Tom Miles
Envoyé : 7 juin 2006 12:18
À : Lua list
Objet : RE: About lua_newthread

Thanks for the speedy response.



>> Can you show us how you initialize your thread??

I am using an approach similar to the one in Game Programming Gems 5, where I have a manager object that controls the main state and dishes out threads when requested. I.e.

//

static void CreateThread(State & state)
{
if (m_MainState == NULL)
{
m_MainState = luaL_newstate();
luaL_openlibs(m_MainState);

luaL_openlib(m_MainState, "Script", scriptLib, 0);
}

state.m_state = lua_newthread(m_MainState);

// save a pointer to the thread manager object in the global table
// using the new thread's vm pointer as a key
lua_pushlightuserdata(m_MainState, state.m_state); <--- Is this causing a problem?
lua_pushlightuserdata(m_MainState, &state);
lua_settable(m_MainState, LUA_GLOBALSINDEX );
}

static void ReleaseThread(State & state)
{
int stackSize = lua_gettop(m_MainState);
for (int n=0; n<stackSize; ++n)
{
// This check should be: lua_isthread() && lua_tothread() == state.m_state
if (lua_touserdata(m_MainState, n) == state.m_state)
{
lua_remove(m_MainState, n);
break;
}
}
// For the time being, set the value of the key (the state we are removing) in our map to be nil
lua_pushlightuserdata(m_MainState, state.m_state);
lua_pushnil(m_MainState);
lua_settable(m_MainState, LUA_GLOBALSINDEX);

// There is also code to close down lua if we have released the last thread here
}

>> If you use a weak value table, the entry will be deleted when the object
>> is collected.

>> Just put "v" in field __mode of the metatable of your table. If you want
>> weak key, just put "k".

As you can see, I am using the globals table, but I suppose I could create a weak table especially for the job instead.

> Tom
>
> -----Original Message-----
> *From:* lua-bounces@bazar2.conectiva.com.br
> [mailto:lua-bounces@bazar2.conectiva.com.br]*On Behalf Of* Raymond Jacobs
> *Sent:* 18 May 2006 16:20
> *To:* Lua list
> *Subject:* Re: About lua_newthread
>
> When you are done with a thread (when lua_resume returns and it's
> not a yield), you should remove the thread directly from the
> stack, this will remove the reference to it and it can then be
> garbage collected (its a pain I know =/).
>
> another method which I've not yet done but should work, is to
> create a new thread, create a lua reference to it (using lua_ref)
> then pop it off the stack immediately (so it doesn't get buried),
> and later when you are done with it, destroy the reference
> (lua_unref) and that should allow it to be GC'd
>
> hope that helps,
>
> Raymond Jacobs
> Owner,
> Ethereal Darkness Interactive
>
>
> On 5/18/06, *mos* <mmosquito@163.com <mailto:mmosquito@163.com>>
> wrote:
>
>
> Hi
>
> in lua5.1 manual:
>
> lua_newthread
> lua_State *lua_newthread (lua_State *L);
> There is no explicit function to close or to destroy a thread.
> Threads are
> subject to garbage collection, like any Lua object
>
> I don't understand this , for example like Npc in a game
>
> function AI()
> while(true) do
> walkto(A)
> walkto(B)
> ....
> walkto(Z)
> end
> end
>
> I bind each npc with a lua_State by lua_newthread
>
> but the npc will die and i should close the lua_State ,
> but I can
> not.
> what can I do ? or some better suggestion ?
>
> Best Regards
> mos
>
>
>



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