[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Garbage collector issues
- From: Edgar Toernig <froese@...>
- Date: Wed, 20 Dec 2000 18:04:14 +0100
Roberto Ierusalimschy wrote:
> 
> > One solution could be something like:
> >
> > LUA_API void lua_userdatasize(lua_State *L, size_t size)
> >
> > which would assign the given size in bytes (to the GC) to the userdata
> > situated on top of the stack.
> 
> You can implement this function as follows (I gess ;-):
> 
> /* in lapi.c */
> LUA_API void lua_userdatasize (lua_State *L, size_t size) {
>   if (ttype(L->top-1) != LUA_TUSERDATA ||
>       tsvalue(L->top-1)->len != 0)
>     lua_error("...");
>   tsvalue(L->top-1)->len = size;
>   L->nblocks += size*sizeof(char);
> }
Don't you think that this (below) will be much simpler and more
versatile?
LUA_API void
lua_gcaccount(lua_State *L, long amount)
{
    L->nblocks += amount;
}
That way, C code may tell the GC how many bytes to consider exported
by the C part.  amount will be negative when freeing space.
Coroutines for example may want to notify about the C stack allocated
to each thread.
There are a lot of places where L->nblocks is modified.  Wouldn't
it be easier to let luaM_malloc do that?  Of course, luaM_free
would require a size argument, too.  But this value is always known.
(Well, your patch above will break it *g*)  Aside from that, there
are architectures that could benefit from a free with a second (size)
argument.
Ciao, ET.
PS: Btw, lua_newuserdata and co are IMHO slightly broken:
> print(dostring"")  -- gives lua_pusheruserdata(L, NULL)
userdata(0): 0x80632b0
> print(dostring"")
userdata(0): 0x8063448 -- and another one?!?
Maybe this change
-  ts->u.d.value = (udata == NULL) ? uts+1 : udata;
+  ts->u.d.value = s ? uts+1 : udata;
would make a little bit more sense.  (There are other
problems too.  Still thinking about a solution.)