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

11
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,22 +1009,23 @@ 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);
if (g->gray == NULL) /* no more `gray' objects? */
g->gcstate = GCSatomic; /* finish propagate phase */
return g->GCmemtrav - oldtrav; /* memory traversed in this step */ return g->GCmemtrav - oldtrav; /* memory traversed in this step */
} }
else { /* no more `gray' objects */ case GCSatomic: {
lu_mem work; lu_mem work;
int sw; int sw;
g->gcstate = GCSatomic; /* finish mark phase */ propagateall(g); /* make sure gray list is empty */
g->GCestimate = g->GCmemtrav; /* save what was counted */; g->GCestimate = g->GCmemtrav; /* save what was counted */;
work = atomic(L); /* add what was traversed by 'atomic' */ work = atomic(L); /* add what was traversed by 'atomic' */
g->GCestimate += work; /* estimate of total memory traversed */ g->GCestimate += work; /* estimate of total memory traversed */
sw = entersweep(L); sw = entersweep(L);
return work + sw * GCSWEEPCOST; return work + sw * GCSWEEPCOST;
} }
}
case GCSsweepstring: { case GCSsweepstring: {
int i; int i;
for (i = 0; i < GCSWEEPMAX && g->sweepstrgc + i < g->strt.size; i++) for (i = 0; i < GCSWEEPMAX && g->sweepstrgc + i < g->strt.size; i++)