From 9fdf73bc9a6b4c6afbfff1d8181fface6b1c6761 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 28 Aug 2000 14:57:04 -0300 Subject: first version for new API --- lgc.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) (limited to 'lgc.c') diff --git a/lgc.c b/lgc.c index 1e26ed51..f6768dd2 100644 --- a/lgc.c +++ b/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 1.62 2000/08/09 19:16:57 roberto Exp roberto $ +** $Id: lgc.c,v 1.63 2000/08/22 17:44:17 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -11,7 +11,6 @@ #include "lgc.h" #include "lmem.h" #include "lobject.h" -#include "lref.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" @@ -145,6 +144,43 @@ static void markall (lua_State *L) { } +static int hasmark (const TObject *o) { + /* valid only for locked objects */ + switch (o->ttype) { + case TAG_STRING: case TAG_USERDATA: + return tsvalue(o)->marked; + case TAG_TABLE: + return ismarked(hvalue(o)); + case TAG_LCLOSURE: case TAG_CCLOSURE: + return ismarked(clvalue(o)->mark); + default: /* number */ + return 1; + } +} + + +/* macro for internal debugging; check if a link of free refs is valid */ +#define VALIDLINK(L, st,n) (NONEXT <= (st) && (st) < (n)) + +static void invalidaterefs (lua_State *L) { + int n = L->refSize; + int i; + for (i=0; irefArray[i]; + if (r->st == HOLD && !hasmark(&r->o)) + r->st = COLLECTED; + LUA_ASSERT((r->st == LOCK && hasmark(&r->o)) || + (r->st == HOLD && hasmark(&r->o)) || + r->st == COLLECTED || + r->st == NONEXT || + (r->st < n && VALIDLINK(L, L->refArray[r->st].st, n)), + "inconsistent ref table"); + } + LUA_ASSERT(VALIDLINK(L, L->refFree, n), "inconsistent ref table"); +} + + + static void collectproto (lua_State *L) { Proto **p = &L->rootproto; Proto *next; @@ -300,7 +336,7 @@ void luaC_collect (lua_State *L, int all) { long lua_collectgarbage (lua_State *L, long limit) { unsigned long recovered = L->nblocks; /* to subtract `nblocks' after gc */ markall(L); - luaR_invalidaterefs(L); + invalidaterefs(L); luaC_collect(L, 0); recovered = recovered - L->nblocks; L->GCthreshold = (limit == 0) ? 2*L->nblocks : L->nblocks+limit; -- cgit v1.2.3-55-g6feb