From d25f7f9d78961543cbbcc0f793e37631030d003c Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 3 May 2010 08:55:40 -0300 Subject: items in 'tobefnz' are kept black (as before recent change) and changed to white only when needed (being moved to 'allgc' when not keeping invariant). --- lgc.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'lgc.c') diff --git a/lgc.c b/lgc.c index 43927a93..a3ec58f0 100644 --- a/lgc.c +++ b/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 2.82 2010/04/29 21:43:36 roberto Exp roberto $ +** $Id: lgc.c,v 2.83 2010/04/30 18:37:14 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -265,7 +265,8 @@ static void markbeingfnz (global_State *g) { GCObject *o; for (o = g->tobefnz; o != NULL; o = gch(o)->next) { lua_assert(testbit(gch(o)->marked, SEPARATED)); - markobject(g, o); + makewhite(g, o); + reallymarkobject(g, o); } } @@ -651,12 +652,15 @@ static void checkSizes (lua_State *L) { static Udata *udata2finalize (global_State *g) { GCObject *o = g->tobefnz; /* get first element */ - g->tobefnz = gch(o)->next; /* remove it from 'tobefnz' list */ - gch(o)->next = g->allgc; /* return it to 'allgc' list */ + Udata *u = rawgco2u(o); + lua_assert(isfinalized(&u->uv)); + g->tobefnz = u->uv.next; /* remove it from 'tobefnz' list */ + u->uv.next = g->allgc; /* return it to 'allgc' list */ g->allgc = o; - lua_assert(isfinalized(gch(o))); - resetbit(gch(o)->marked, SEPARATED); /* mark it as such */ - return rawgco2u(o); + resetbit(u->uv.marked, SEPARATED); /* mark that it is not in 'tobefnz' */ + if (!keepinvariant(g)) /* not keeping invariant? */ + makewhite(g, o); /* "sweep" object */ + return u; } @@ -833,7 +837,6 @@ static l_mem singlestep (lua_State *L) { return GCSWEEPMAX*GCSWEEPCOST; } else { - sweepwholelist(L, &g->tobefnz); /* sweep 'to-be-finalized' list */ g->sweepgc = &g->allgc; /* go to next phase */ g->gcstate = GCSsweep; return GCSWEEPCOST; -- cgit v1.2.3-55-g6feb