mirror of https://github.com/rusefi/lua.git
Bug: set correct pause when (re)entering gen. collection.
This commit is contained in:
parent
c6cea857a4
commit
a1f77a234a
63
lgc.c
63
lgc.c
|
@ -1041,7 +1041,25 @@ void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) {
|
||||||
** =======================================================
|
** =======================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void setpause (global_State *g);
|
|
||||||
|
/*
|
||||||
|
** Set the "time" to wait before starting a new GC cycle; cycle will
|
||||||
|
** start when memory use hits the threshold of ('estimate' * pause /
|
||||||
|
** PAUSEADJ). (Division by 'estimate' should be OK: it cannot be zero,
|
||||||
|
** because Lua cannot even start with less than PAUSEADJ bytes).
|
||||||
|
*/
|
||||||
|
static void setpause (global_State *g) {
|
||||||
|
l_mem threshold, debt;
|
||||||
|
int pause = getgcparam(g->gcpause);
|
||||||
|
l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */
|
||||||
|
lua_assert(estimate > 0);
|
||||||
|
threshold = (pause < MAX_LMEM / estimate) /* overflow? */
|
||||||
|
? estimate * pause /* no overflow */
|
||||||
|
: MAX_LMEM; /* overflow; truncate to maximum */
|
||||||
|
debt = gettotalbytes(g) - threshold;
|
||||||
|
if (debt > 0) debt = 0;
|
||||||
|
luaE_setdebt(g, debt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1285,6 +1303,15 @@ static void atomic2gen (lua_State *L, global_State *g) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Set debt for the next minor collection, which will happen when
|
||||||
|
** memory grows 'genminormul'%.
|
||||||
|
*/
|
||||||
|
static void setminordebt (global_State *g) {
|
||||||
|
luaE_setdebt(g, -(cast(l_mem, (gettotalbytes(g) / 100)) * g->genminormul));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Enter generational mode. Must go until the end of an atomic cycle
|
** Enter generational mode. Must go until the end of an atomic cycle
|
||||||
** to ensure that all objects are correctly marked and weak tables
|
** to ensure that all objects are correctly marked and weak tables
|
||||||
|
@ -1297,6 +1324,7 @@ static lu_mem entergen (lua_State *L, global_State *g) {
|
||||||
luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */
|
luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */
|
||||||
numobjs = atomic(L); /* propagates all and then do the atomic stuff */
|
numobjs = atomic(L); /* propagates all and then do the atomic stuff */
|
||||||
atomic2gen(L, g);
|
atomic2gen(L, g);
|
||||||
|
setminordebt(g); /* set debt assuming next cycle will be minor */
|
||||||
return numobjs;
|
return numobjs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1342,15 +1370,6 @@ static lu_mem fullgen (lua_State *L, global_State *g) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Set debt for the next minor collection, which will happen when
|
|
||||||
** memory grows 'genminormul'%.
|
|
||||||
*/
|
|
||||||
static void setminordebt (global_State *g) {
|
|
||||||
luaE_setdebt(g, -(cast(l_mem, (gettotalbytes(g) / 100)) * g->genminormul));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Does a major collection after last collection was a "bad collection".
|
** Does a major collection after last collection was a "bad collection".
|
||||||
**
|
**
|
||||||
|
@ -1422,8 +1441,8 @@ static void genstep (lua_State *L, global_State *g) {
|
||||||
lu_mem numobjs = fullgen(L, g); /* do a major collection */
|
lu_mem numobjs = fullgen(L, g); /* do a major collection */
|
||||||
if (gettotalbytes(g) < majorbase + (majorinc / 2)) {
|
if (gettotalbytes(g) < majorbase + (majorinc / 2)) {
|
||||||
/* collected at least half of memory growth since last major
|
/* collected at least half of memory growth since last major
|
||||||
collection; keep doing minor collections */
|
collection; keep doing minor collections. */
|
||||||
setminordebt(g);
|
lua_assert(g->lastatomic == 0);
|
||||||
}
|
}
|
||||||
else { /* bad collection */
|
else { /* bad collection */
|
||||||
g->lastatomic = numobjs; /* signal that last collection was bad */
|
g->lastatomic = numobjs; /* signal that last collection was bad */
|
||||||
|
@ -1449,26 +1468,6 @@ static void genstep (lua_State *L, global_State *g) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Set the "time" to wait before starting a new GC cycle; cycle will
|
|
||||||
** start when memory use hits the threshold of ('estimate' * pause /
|
|
||||||
** PAUSEADJ). (Division by 'estimate' should be OK: it cannot be zero,
|
|
||||||
** because Lua cannot even start with less than PAUSEADJ bytes).
|
|
||||||
*/
|
|
||||||
static void setpause (global_State *g) {
|
|
||||||
l_mem threshold, debt;
|
|
||||||
int pause = getgcparam(g->gcpause);
|
|
||||||
l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */
|
|
||||||
lua_assert(estimate > 0);
|
|
||||||
threshold = (pause < MAX_LMEM / estimate) /* overflow? */
|
|
||||||
? estimate * pause /* no overflow */
|
|
||||||
: MAX_LMEM; /* overflow; truncate to maximum */
|
|
||||||
debt = gettotalbytes(g) - threshold;
|
|
||||||
if (debt > 0) debt = 0;
|
|
||||||
luaE_setdebt(g, debt);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Enter first sweep phase.
|
** Enter first sweep phase.
|
||||||
** The call to 'sweeptolive' makes the pointer point to an object
|
** The call to 'sweeptolive' makes the pointer point to an object
|
||||||
|
|
Loading…
Reference in New Issue