aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lgc.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/lgc.c b/lgc.c
index dd824e77..f8f43393 100644
--- a/lgc.c
+++ b/lgc.c
@@ -638,7 +638,9 @@ static int traversethread (global_State *g, lua_State *th) {
638 for (uv = th->openupval; uv != NULL; uv = uv->u.open.next) 638 for (uv = th->openupval; uv != NULL; uv = uv->u.open.next)
639 markobject(g, uv); /* open upvalues cannot be collected */ 639 markobject(g, uv); /* open upvalues cannot be collected */
640 if (g->gcstate == GCSatomic) { /* final traversal? */ 640 if (g->gcstate == GCSatomic) { /* final traversal? */
641 for (; o < th->stack_last.p + EXTRA_STACK; o++) 641 if (!g->gcemergency)
642 luaD_shrinkstack(th); /* do not change stack in emergency cycle */
643 for (o = th->top.p; o < th->stack_last.p + EXTRA_STACK; o++)
642 setnilvalue(s2v(o)); /* clear dead stack slice */ 644 setnilvalue(s2v(o)); /* clear dead stack slice */
643 /* 'remarkupvals' may have removed thread from 'twups' list */ 645 /* 'remarkupvals' may have removed thread from 'twups' list */
644 if (!isintwups(th) && th->openupval != NULL) { 646 if (!isintwups(th) && th->openupval != NULL) {
@@ -646,8 +648,6 @@ static int traversethread (global_State *g, lua_State *th) {
646 g->twups = th; 648 g->twups = th;
647 } 649 }
648 } 650 }
649 else if (!g->gcemergency)
650 luaD_shrinkstack(th); /* do not change stack in emergency cycle */
651 return 1 + stacksize(th); 651 return 1 + stacksize(th);
652} 652}
653 653
@@ -1710,6 +1710,8 @@ static void fullinc (lua_State *L, global_State *g) {
1710 entersweep(L); /* sweep everything to turn them back to white */ 1710 entersweep(L); /* sweep everything to turn them back to white */
1711 /* finish any pending sweep phase to start a new cycle */ 1711 /* finish any pending sweep phase to start a new cycle */
1712 luaC_runtilstate(L, bitmask(GCSpause)); 1712 luaC_runtilstate(L, bitmask(GCSpause));
1713 luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */
1714 g->gcstate = GCSenteratomic; /* go straight to atomic phase ??? */
1713 luaC_runtilstate(L, bitmask(GCScallfin)); /* run up to finalizers */ 1715 luaC_runtilstate(L, bitmask(GCScallfin)); /* run up to finalizers */
1714 /* estimate must be correct after a full GC cycle */ 1716 /* estimate must be correct after a full GC cycle */
1715 lua_assert(g->GCestimate == gettotalbytes(g)); 1717 lua_assert(g->GCestimate == gettotalbytes(g));