change to allow collector to stop when it goes to the atomic phase

(just for debugging)
This commit is contained in:
Roberto Ierusalimschy
2013-08-07 12:39:09 -03:00
parent 623e388bb4
commit 78b941039d

33
lgc.c
View File

@@ -1,5 +1,5 @@
/* /*
** $Id: lgc.c,v 2.142 2013/08/05 16:58:28 roberto Exp roberto $ ** $Id: lgc.c,v 2.143 2013/08/07 12:18:11 roberto Exp roberto $
** Garbage Collector ** Garbage Collector
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -1009,21 +1009,22 @@ static lu_mem singlestep (lua_State *L) {
return g->GCmemtrav; return g->GCmemtrav;
} }
case GCSpropagate: { case GCSpropagate: {
if (g->gray) { lu_mem oldtrav = g->GCmemtrav;
lu_mem oldtrav = g->GCmemtrav; lua_assert(g->gray);
propagatemark(g); propagatemark(g);
return g->GCmemtrav - oldtrav; /* memory traversed in this step */ if (g->gray == NULL) /* no more `gray' objects? */
} g->gcstate = GCSatomic; /* finish propagate phase */
else { /* no more `gray' objects */ return g->GCmemtrav - oldtrav; /* memory traversed in this step */
lu_mem work; }
int sw; case GCSatomic: {
g->gcstate = GCSatomic; /* finish mark phase */ lu_mem work;
g->GCestimate = g->GCmemtrav; /* save what was counted */; int sw;
work = atomic(L); /* add what was traversed by 'atomic' */ propagateall(g); /* make sure gray list is empty */
g->GCestimate += work; /* estimate of total memory traversed */ g->GCestimate = g->GCmemtrav; /* save what was counted */;
sw = entersweep(L); work = atomic(L); /* add what was traversed by 'atomic' */
return work + sw * GCSWEEPCOST; g->GCestimate += work; /* estimate of total memory traversed */
} sw = entersweep(L);
return work + sw * GCSWEEPCOST;
} }
case GCSsweepstring: { case GCSsweepstring: {
int i; int i;