Sfoglia il codice sorgente

bug: garbage collector can trigger too many times in recursive loops,
because it was not computing the size of CallInfo structures in threads

Roberto Ierusalimschy 12 anni fa
parent
commit
dcd35b4595
1 ha cambiato i file con 10 aggiunte e 3 eliminazioni
  1. 10 3
      lgc.c

+ 10 - 3
lgc.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lgc.c,v 2.140 2013/03/16 21:10:18 roberto Exp $
+** $Id: lgc.c,v 2.140.1.1 2013/04/12 18:48:47 roberto Exp roberto $
 ** Garbage Collector
 ** Garbage Collector
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -493,17 +493,24 @@ static lu_mem traverseLclosure (global_State *g, LClosure *cl) {
 
 
 
 
 static lu_mem traversestack (global_State *g, lua_State *th) {
 static lu_mem traversestack (global_State *g, lua_State *th) {
+  int n = 0;
   StkId o = th->stack;
   StkId o = th->stack;
   if (o == NULL)
   if (o == NULL)
     return 1;  /* stack not completely built yet */
     return 1;  /* stack not completely built yet */
-  for (; o < th->top; o++)
+  for (; o < th->top; o++)  /* mark live elements in the stack */
     markvalue(g, o);
     markvalue(g, o);
   if (g->gcstate == GCSatomic) {  /* final traversal? */
   if (g->gcstate == GCSatomic) {  /* final traversal? */
     StkId lim = th->stack + th->stacksize;  /* real end of stack */
     StkId lim = th->stack + th->stacksize;  /* real end of stack */
     for (; o < lim; o++)  /* clear not-marked stack slice */
     for (; o < lim; o++)  /* clear not-marked stack slice */
       setnilvalue(o);
       setnilvalue(o);
   }
   }
-  return sizeof(lua_State) + sizeof(TValue) * th->stacksize;
+  else {  /* count call infos to compute size */
+    CallInfo *ci;
+    for (ci = &th->base_ci; ci != th->ci; ci = ci->next)
+      n++;
+  }
+  return sizeof(lua_State) + sizeof(TValue) * th->stacksize +
+         sizeof(CallInfo) * n;
 }
 }