mirror of
https://github.com/lua/lua
synced 2025-02-11 18:54:00 +03:00
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.
This commit is contained in:
parent
d12262068d
commit
38425e0692
4
lgc.c
4
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user