فهرست منبع

change to allow collector to stop when it goes to the atomic phase
(just for debugging)

Roberto Ierusalimschy 12 سال پیش
والد
کامیت
78b941039d
1فایلهای تغییر یافته به همراه17 افزوده شده و 16 حذف شده
  1. 17 16
      lgc.c

+ 17 - 16
lgc.c

@@ -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
 ** See Copyright Notice in lua.h
 */
@@ -1009,21 +1009,22 @@ static lu_mem singlestep (lua_State *L) {
       return g->GCmemtrav;
     }
     case GCSpropagate: {
-      if (g->gray) {
-        lu_mem oldtrav = g->GCmemtrav;
-        propagatemark(g);
-        return g->GCmemtrav - oldtrav;  /* memory traversed in this step */
-      }
-      else {  /* no more `gray' objects */
-        lu_mem work;
-        int sw;
-        g->gcstate = GCSatomic;  /* finish mark phase */
-        g->GCestimate = g->GCmemtrav;  /* save what was counted */;
-        work = atomic(L);  /* add what was traversed by 'atomic' */
-        g->GCestimate += work;  /* estimate of total memory traversed */ 
-        sw = entersweep(L);
-        return work + sw * GCSWEEPCOST;
-      }
+      lu_mem oldtrav = g->GCmemtrav;
+      lua_assert(g->gray);
+      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 */
+    }
+    case GCSatomic: {
+      lu_mem work;
+      int sw;
+      propagateall(g);  /* make sure gray list is empty */
+      g->GCestimate = g->GCmemtrav;  /* save what was counted */;
+      work = atomic(L);  /* add what was traversed by 'atomic' */
+      g->GCestimate += work;  /* estimate of total memory traversed */ 
+      sw = entersweep(L);
+      return work + sw * GCSWEEPCOST;
     }
     case GCSsweepstring: {
       int i;