** Does a major collection after last collection was a "bad collection". ** ** When the program is building a big structure, it allocates lots of ** memory but generates very little garbage. In those scenarios, ** the generational mode just wastes time doing small collections, and ** major collections are frequently what we call a "bad collection", a ** collection that frees too few objects. To av
| 1400 | ** ('g->lastatomic != 0' also means that the last collection was bad.) |
| 1401 | */ |
| 1402 | static void stepgenfull (lua_State *L, global_State *g) { |
| 1403 | lu_mem newatomic; /* count of traversed objects */ |
| 1404 | lu_mem lastatomic = g->lastatomic; /* count from last collection */ |
| 1405 | if (g->gckind == KGC_GEN) /* still in generational mode? */ |
| 1406 | enterinc(g); /* enter incremental mode */ |
| 1407 | luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */ |
| 1408 | newatomic = atomic(L); /* mark everybody */ |
| 1409 | if (newatomic < lastatomic + (lastatomic >> 3)) { /* good collection? */ |
| 1410 | atomic2gen(L, g); /* return to generational mode */ |
| 1411 | setminordebt(g); |
| 1412 | } |
| 1413 | else { /* another bad collection; stay in incremental mode */ |
| 1414 | g->GCestimate = gettotalbytes(g); /* first estimate */ |
| 1415 | entersweep(L); |
| 1416 | luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */ |
| 1417 | setpause(g); |
| 1418 | g->lastatomic = newatomic; |
| 1419 | } |
| 1420 | } |
| 1421 | |
| 1422 | |
| 1423 | /* |
no test coverage detected