From 38425e069243fe6d991f2e99b4bba192af3563c7 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 1 Apr 2019 14:22:07 -0300 Subject: Avoid moving the collector while in 'GCSenteratomic' state The 'GCSenteratomic' is just an auxiliary state for transitioning to 'GCSatomic'. All GC traversals should be done either on the 'GCSpropagate' state or the 'GCSatomic' state. --- lgc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lgc.c b/lgc.c index 8cb3e9fa..e9189ac3 100644 --- a/lgc.c +++ b/lgc.c @@ -1423,6 +1423,7 @@ static lu_mem atomic (lua_State *L) { /* registry and global metatables may be changed by API */ markvalue(g, &g->l_registry); markmt(g); /* mark global metatables */ + work += propagateall(g); /* empties 'gray' list */ /* remark occasional upvalues of (maybe) dead threads */ work += remarkupvals(g); work += propagateall(g); /* propagate changes */ @@ -1486,8 +1487,7 @@ static lu_mem singlestep (lua_State *L) { return propagatemark(g); /* traverse one gray object */ } case GCSenteratomic: { - lu_mem work = propagateall(g); /* make sure gray list is empty */ - work += atomic(L); /* work is what was traversed by 'atomic' */ + lu_mem work = atomic(L); /* work is what was traversed by 'atomic' */ entersweep(L); g->GCestimate = gettotalbytes(g); /* first estimate */; return work; -- cgit v1.2.3-55-g6feb