[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Child states and garbage collection
- From: Jamie Webb <j@...>
- Date: Mon, 13 Sep 2004 14:21:05 +0100
On Sun, Sep 12, 2004 at 10:37:43PM -0500, Matthew Harmon wrote:
> Thanks... I did have a handle on that, I should have been more clear. The
> child state definitely got GCed as you said.
>
> I guess what I'm confused about is this... should doing my
> luaL_ref(childState, LUA_REGISTRYINDEX) with the entry point be enough to
> prevent GCing of the childState? Since the reference is "within itself",
> does that count? It seems so because my memory usage keeps creeping up if I
> don't luaL_unref(). Yet... sometimes one get's GC'd and causes that crash.
You're confusing the two separate things which you need to keep track
of:
- The child state itself. This is the object that is pushed onto the
stack as a result of calling lua_newthread. Even though you have a
C-side pointer to this object (a lua_State), it is still subject to
being GCed if you don't save the 'Lua half' of it somewhere, at
which point the C-side pointer will be left dangling, hence the
crash. Doing a luaL_ref on that object will indeed preserve it, but
it doesn't sound like you're doing that. So, this is being GCed. You
need to add refs and unrefs for this object.
- The script which will be run in the child state. You're saving a
reference to this, and it won't be GCed unless you unref it again
/even if the state it was going to run in has been GCed/. Hence the
creeping memory usage you saw. You're treating this object
correctly, but seeing problems when you try to unref it because of
the above.
-- Jamie Webb