From d5b83ead90fba27faa344c72406d85987d2460a4 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy <roberto@inf.puc-rio.br> Date: Wed, 6 Jun 2001 15:00:19 -0300 Subject: new implementation for userdatas, without `keys' --- lgc.c | 62 +++++++++++++++++++++++++++++--------------------------------- 1 file changed, 29 insertions(+), 33 deletions(-) (limited to 'lgc.c') diff --git a/lgc.c b/lgc.c index a82039dd..86b7d092 100644 --- a/lgc.c +++ b/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 1.98 2001/06/05 18:17:01 roberto Exp roberto $ +** $Id: lgc.c,v 1.99 2001/06/05 19:27:32 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -82,9 +82,12 @@ static void marktable (GCState *st, Hash *h) { static void markobject (GCState *st, TObject *o) { switch (ttype(o)) { - case LUA_TUSERDATA: case LUA_TSTRING: + case LUA_TSTRING: strmark(tsvalue(o)); break; + case LUA_TUSERDATA: + uvalue(o)->marked = 1; + break; case LUA_TFUNCTION: markclosure(st, clvalue(o)); break; @@ -190,8 +193,10 @@ static void markall (lua_State *L) { static int hasmark (const TObject *o) { switch (ttype(o)) { - case LUA_TSTRING: case LUA_TUSERDATA: + case LUA_TSTRING: return tsvalue(o)->marked; + case LUA_TUSERDATA: + return uvalue(o)->marked; case LUA_TTABLE: return ismarked(hvalue(o)); case LUA_TFUNCTION: @@ -275,9 +280,21 @@ static void collecttable (lua_State *L) { } -static void checktab (lua_State *L, stringtable *tb) { - if (tb->nuse < (ls_nstr)(tb->size/4) && tb->size > MINPOWER2) - luaS_resize(L, tb, tb->size/2); /* table is too big */ +static void collectudata (lua_State *L) { + Udata **p = &G(L)->rootudata; + Udata *next; + while ((next = *p) != NULL) { + if (next->marked) { + next->marked = 0; /* unmark */ + p = &next->next; + } + else { /* collect */ + int tag = next->tag; + *p = next->next; + next->next = G(L)->TMtable[tag].collected; /* chain udata */ + G(L)->TMtable[tag].collected = next; + } + } } @@ -299,33 +316,12 @@ static void collectstrings (lua_State *L, int all) { } } } - checktab(L, &G(L)->strt); + if (G(L)->strt.nuse < (ls_nstr)(G(L)->strt.size/4) && + G(L)->strt.size > MINPOWER2) + luaS_resize(L, G(L)->strt.size/2); /* table is too big */ } -static void collectudata (lua_State *L, int all) { - int i; - for (i=0; i<G(L)->udt.size; i++) { /* for each list */ - TString **p = &G(L)->udt.hash[i]; - TString *next; - while ((next = *p) != NULL) { - lua_assert(next->marked <= 1); - if (next->marked && !all) { /* preserve? */ - next->marked = 0; - p = &next->nexthash; - } - else { /* collect */ - int tag = next->u.d.tag; - *p = next->nexthash; - next->nexthash = G(L)->TMtable[tag].collected; /* chain udata */ - G(L)->TMtable[tag].collected = next; - G(L)->udt.nuse--; - } - } - } - checktab(L, &G(L)->udt); -} - #define MINBUFFER 256 static void checkMbuffer (lua_State *L) { @@ -356,10 +352,10 @@ static void callgcTMudata (lua_State *L) { int tag; G(L)->GCthreshold = 2*G(L)->nblocks; /* avoid GC during tag methods */ for (tag=G(L)->ntag-1; tag>=0; tag--) { /* for each tag (in reverse order) */ - TString *udata; + Udata *udata; while ((udata = G(L)->TMtable[tag].collected) != NULL) { TObject obj; - G(L)->TMtable[tag].collected = udata->nexthash; /* remove it from list */ + G(L)->TMtable[tag].collected = udata->next; /* remove it from list */ setuvalue(&obj, udata); callgcTM(L, &obj); luaM_free(L, udata, sizeudata(udata->len)); @@ -370,7 +366,7 @@ static void callgcTMudata (lua_State *L) { void luaC_collect (lua_State *L, int all) { lua_lockgc(L); - collectudata(L, all); + collectudata(L); callgcTMudata(L); collectstrings(L, all); collecttable(L); -- cgit v1.2.3-55-g6feb