diff --git a/lgc.c b/lgc.c index f38f08f9..0d0579d0 100644 --- a/lgc.c +++ b/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 2.44 2008/02/19 18:55:09 roberto Exp roberto $ +** $Id: lgc.c,v 2.45 2008/06/23 16:51:28 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -210,7 +210,6 @@ static void markbeingfnz (global_State *g) { do { u = gch(u)->next; lua_assert(testbit(gch(u)->marked, SEPARATED)); - lua_assert(!iswhite(u)); /* must be marked, if left from previous GC */ makewhite(g, u); reallymarkobject(g, u); } while (u != g->tobefnz); @@ -664,12 +663,10 @@ size_t luaC_separateudata (lua_State *L, int all) { while ((curr = *p) != NULL) { lua_assert(ttisuserdata(gch(curr)) && !isfinalized(gco2u(curr))); lua_assert(testbit(gch(curr)->marked, SEPARATED)); - if (all) makewhite(g, curr); /* if 'all', collect all objects */ - if (!iswhite(curr)) /* not being collected? */ + if (!(all || iswhite(curr))) /* not being collected? */ p = &gch(curr)->next; /* don't bother with it */ else { l_setbit(gch(curr)->marked, FINALIZEDBIT); /* won't be finalized again */ - reallymarkobject(g, curr); /* won't be collected now */ deadmem += sizeudata(gco2u(curr)); *p = gch(curr)->next; /* remove 'curr' from 'tmudata' list */ /* link 'curr' at the end of 'tobefnz' list */ @@ -746,6 +743,7 @@ static void atomic (lua_State *L) { traverselistofgrays(g, &g->grayagain); /* remark gray again */ convergeephemerons(g); udsize = luaC_separateudata(L, 0); /* separate userdata to be finalized */ + markbeingfnz(g); /* mark userdata that will be finalized */ udsize += propagateall(g); /* remark, to propagate `preserveness' */ convergeephemerons(g); /* remove collected objects from weak tables */