mirror of
https://github.com/lua/lua
synced 2024-11-28 15:43:08 +03:00
Rename of fields in global state that control GC
All fields in the global state that control the pace of the garbage collector prefixed with 'GC'.
This commit is contained in:
parent
007b8c7a01
commit
a04e0ffdb9
4
lapi.c
4
lapi.c
@ -1190,11 +1190,11 @@ LUA_API int lua_gc (lua_State *L, int what, ...) {
|
|||||||
}
|
}
|
||||||
case LUA_GCCOUNT: {
|
case LUA_GCCOUNT: {
|
||||||
/* GC values are expressed in Kbytes: #bytes/2^10 */
|
/* GC values are expressed in Kbytes: #bytes/2^10 */
|
||||||
res = cast_int(g->totalbytes >> 10);
|
res = cast_int(g->GCtotalbytes >> 10);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LUA_GCCOUNTB: {
|
case LUA_GCCOUNTB: {
|
||||||
res = cast_int(g->totalbytes & 0x3ff);
|
res = cast_int(g->GCtotalbytes & 0x3ff);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LUA_GCSTEP: {
|
case LUA_GCSTEP: {
|
||||||
|
28
lgc.c
28
lgc.c
@ -290,7 +290,7 @@ GCObject *luaC_newobj (lua_State *L, lu_byte tt, size_t sz) {
|
|||||||
** (only closures can), and a userdata's metatable must be a table.
|
** (only closures can), and a userdata's metatable must be a table.
|
||||||
*/
|
*/
|
||||||
static void reallymarkobject (global_State *g, GCObject *o) {
|
static void reallymarkobject (global_State *g, GCObject *o) {
|
||||||
g->marked++;
|
g->GCmarked++;
|
||||||
switch (o->tt) {
|
switch (o->tt) {
|
||||||
case LUA_VSHRSTR:
|
case LUA_VSHRSTR:
|
||||||
case LUA_VLNGSTR: {
|
case LUA_VLNGSTR: {
|
||||||
@ -401,7 +401,7 @@ static void cleargraylists (global_State *g) {
|
|||||||
*/
|
*/
|
||||||
static void restartcollection (global_State *g) {
|
static void restartcollection (global_State *g) {
|
||||||
cleargraylists(g);
|
cleargraylists(g);
|
||||||
g->marked = NFIXED;
|
g->GCmarked = NFIXED;
|
||||||
markobject(g, g->mainthread);
|
markobject(g, g->mainthread);
|
||||||
markvalue(g, &g->l_registry);
|
markvalue(g, &g->l_registry);
|
||||||
markmt(g);
|
markmt(g);
|
||||||
@ -781,7 +781,7 @@ static void freeupval (lua_State *L, UpVal *uv) {
|
|||||||
|
|
||||||
|
|
||||||
static void freeobj (lua_State *L, GCObject *o) {
|
static void freeobj (lua_State *L, GCObject *o) {
|
||||||
G(L)->totalobjs--;
|
G(L)->GCtotalobjs--;
|
||||||
switch (o->tt) {
|
switch (o->tt) {
|
||||||
case LUA_VPROTO:
|
case LUA_VPROTO:
|
||||||
luaF_freeproto(L, gco2p(o));
|
luaF_freeproto(L, gco2p(o));
|
||||||
@ -1052,7 +1052,7 @@ void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) {
|
|||||||
** approximately (marked * pause / 100).
|
** approximately (marked * pause / 100).
|
||||||
*/
|
*/
|
||||||
static void setpause (global_State *g) {
|
static void setpause (global_State *g) {
|
||||||
l_obj threshold = applygcparam(g, PAUSE, g->marked);
|
l_obj threshold = applygcparam(g, PAUSE, g->GCmarked);
|
||||||
l_obj debt = threshold - gettotalobjs(g);
|
l_obj debt = threshold - gettotalobjs(g);
|
||||||
if (debt < 0) debt = 0;
|
if (debt < 0) debt = 0;
|
||||||
luaE_setdebt(g, debt);
|
luaE_setdebt(g, debt);
|
||||||
@ -1236,7 +1236,7 @@ static void finishgencycle (lua_State *L, global_State *g) {
|
|||||||
** in generational mode.
|
** in generational mode.
|
||||||
*/
|
*/
|
||||||
static void minor2inc (lua_State *L, global_State *g, lu_byte kind) {
|
static void minor2inc (lua_State *L, global_State *g, lu_byte kind) {
|
||||||
g->GCmajorminor = g->marked; /* number of live objects */
|
g->GCmajorminor = g->GCmarked; /* number of live objects */
|
||||||
g->gckind = kind;
|
g->gckind = kind;
|
||||||
g->reallyold = g->old1 = g->survival = NULL;
|
g->reallyold = g->old1 = g->survival = NULL;
|
||||||
g->finobjrold = g->finobjold1 = g->finobjsur = NULL;
|
g->finobjrold = g->finobjold1 = g->finobjsur = NULL;
|
||||||
@ -1260,7 +1260,7 @@ static void minor2inc (lua_State *L, global_State *g, lu_byte kind) {
|
|||||||
static int checkminormajor (global_State *g, l_obj addedold1) {
|
static int checkminormajor (global_State *g, l_obj addedold1) {
|
||||||
l_obj step = applygcparam(g, MINORMUL, g->GCmajorminor);
|
l_obj step = applygcparam(g, MINORMUL, g->GCmajorminor);
|
||||||
l_obj limit = applygcparam(g, MINORMAJOR, g->GCmajorminor);
|
l_obj limit = applygcparam(g, MINORMAJOR, g->GCmajorminor);
|
||||||
return (addedold1 >= (step >> 1) || g->marked >= limit);
|
return (addedold1 >= (step >> 1) || g->GCmarked >= limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1270,7 +1270,7 @@ static int checkminormajor (global_State *g, l_obj addedold1) {
|
|||||||
*/
|
*/
|
||||||
static void youngcollection (lua_State *L, global_State *g) {
|
static void youngcollection (lua_State *L, global_State *g) {
|
||||||
l_obj addedold1 = 0;
|
l_obj addedold1 = 0;
|
||||||
l_obj marked = g->marked; /* preserve 'g->marked' */
|
l_obj marked = g->GCmarked; /* preserve 'g->GCmarked' */
|
||||||
GCObject **psurvival; /* to point to first non-dead survival object */
|
GCObject **psurvival; /* to point to first non-dead survival object */
|
||||||
GCObject *dummy; /* dummy out parameter to 'sweepgen' */
|
GCObject *dummy; /* dummy out parameter to 'sweepgen' */
|
||||||
lua_assert(g->gcstate == GCSpropagate);
|
lua_assert(g->gcstate == GCSpropagate);
|
||||||
@ -1304,12 +1304,12 @@ static void youngcollection (lua_State *L, global_State *g) {
|
|||||||
sweepgen(L, g, &g->tobefnz, NULL, &dummy, &addedold1);
|
sweepgen(L, g, &g->tobefnz, NULL, &dummy, &addedold1);
|
||||||
|
|
||||||
/* keep total number of added old1 objects */
|
/* keep total number of added old1 objects */
|
||||||
g->marked = marked + addedold1;
|
g->GCmarked = marked + addedold1;
|
||||||
|
|
||||||
/* decide whether to shift to major mode */
|
/* decide whether to shift to major mode */
|
||||||
if (checkminormajor(g, addedold1)) {
|
if (checkminormajor(g, addedold1)) {
|
||||||
minor2inc(L, g, KGC_GENMAJOR); /* go to major mode */
|
minor2inc(L, g, KGC_GENMAJOR); /* go to major mode */
|
||||||
g->marked = 0; /* avoid pause in first major cycle */
|
g->GCmarked = 0; /* avoid pause in first major cycle */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
finishgencycle(L, g); /* still in minor mode; finish it */
|
finishgencycle(L, g); /* still in minor mode; finish it */
|
||||||
@ -1338,8 +1338,8 @@ static void atomic2gen (lua_State *L, global_State *g) {
|
|||||||
sweep2old(L, &g->tobefnz);
|
sweep2old(L, &g->tobefnz);
|
||||||
|
|
||||||
g->gckind = KGC_GENMINOR;
|
g->gckind = KGC_GENMINOR;
|
||||||
g->GCmajorminor = g->marked; /* "base" for number of objects */
|
g->GCmajorminor = g->GCmarked; /* "base" for number of objects */
|
||||||
g->marked = 0; /* to count the number of added old1 objects */
|
g->GCmarked = 0; /* to count the number of added old1 objects */
|
||||||
finishgencycle(L, g);
|
finishgencycle(L, g);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1407,14 +1407,14 @@ static int checkmajorminor (lua_State *L, global_State *g) {
|
|||||||
l_obj numobjs = gettotalobjs(g);
|
l_obj numobjs = gettotalobjs(g);
|
||||||
l_obj addedobjs = numobjs - g->GCmajorminor;
|
l_obj addedobjs = numobjs - g->GCmajorminor;
|
||||||
l_obj limit = applygcparam(g, MAJORMINOR, addedobjs);
|
l_obj limit = applygcparam(g, MAJORMINOR, addedobjs);
|
||||||
l_obj tobecollected = numobjs - g->marked;
|
l_obj tobecollected = numobjs - g->GCmarked;
|
||||||
if (tobecollected > limit) {
|
if (tobecollected > limit) {
|
||||||
atomic2gen(L, g); /* return to generational mode */
|
atomic2gen(L, g); /* return to generational mode */
|
||||||
setminordebt(g);
|
setminordebt(g);
|
||||||
return 0; /* exit incremental collection */
|
return 0; /* exit incremental collection */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g->GCmajorminor = g->marked; /* prepare for next collection */
|
g->GCmajorminor = g->GCmarked; /* prepare for next collection */
|
||||||
return 1; /* stay doing incremental collections */
|
return 1; /* stay doing incremental collections */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1692,7 +1692,7 @@ static void fullinc (lua_State *L, global_State *g) {
|
|||||||
luaC_runtilstate(L, GCSpause, 1);
|
luaC_runtilstate(L, GCSpause, 1);
|
||||||
luaC_runtilstate(L, GCScallfin, 1); /* run up to finalizers */
|
luaC_runtilstate(L, GCScallfin, 1); /* run up to finalizers */
|
||||||
/* 'marked' must be correct after a full GC cycle */
|
/* 'marked' must be correct after a full GC cycle */
|
||||||
lua_assert(g->marked == gettotalobjs(g));
|
lua_assert(g->GCmarked == gettotalobjs(g));
|
||||||
luaC_runtilstate(L, GCSpause, 1); /* finish collection */
|
luaC_runtilstate(L, GCSpause, 1); /* finish collection */
|
||||||
setpause(g);
|
setpause(g);
|
||||||
}
|
}
|
||||||
|
8
lmem.c
8
lmem.c
@ -151,7 +151,7 @@ void luaM_free_ (lua_State *L, void *block, size_t osize) {
|
|||||||
global_State *g = G(L);
|
global_State *g = G(L);
|
||||||
lua_assert((osize == 0) == (block == NULL));
|
lua_assert((osize == 0) == (block == NULL));
|
||||||
callfrealloc(g, block, osize, 0);
|
callfrealloc(g, block, osize, 0);
|
||||||
g->totalbytes -= osize;
|
g->GCtotalbytes -= osize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -181,10 +181,10 @@ void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {
|
|||||||
if (l_unlikely(newblock == NULL && nsize > 0)) {
|
if (l_unlikely(newblock == NULL && nsize > 0)) {
|
||||||
newblock = tryagain(L, block, osize, nsize);
|
newblock = tryagain(L, block, osize, nsize);
|
||||||
if (newblock == NULL) /* still no memory? */
|
if (newblock == NULL) /* still no memory? */
|
||||||
return NULL; /* do not update 'totalbytes' */
|
return NULL; /* do not update 'GCtotalbytes' */
|
||||||
}
|
}
|
||||||
lua_assert((nsize == 0) == (newblock == NULL));
|
lua_assert((nsize == 0) == (newblock == NULL));
|
||||||
g->totalbytes += nsize - osize;
|
g->GCtotalbytes += nsize - osize;
|
||||||
return newblock;
|
return newblock;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,7 +209,7 @@ void *luaM_malloc_ (lua_State *L, size_t size, int tag) {
|
|||||||
if (newblock == NULL)
|
if (newblock == NULL)
|
||||||
luaM_error(L);
|
luaM_error(L);
|
||||||
}
|
}
|
||||||
g->totalbytes += size;
|
g->GCtotalbytes += size;
|
||||||
return newblock;
|
return newblock;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
16
lstate.c
16
lstate.c
@ -74,15 +74,15 @@ typedef struct LG {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** set GCdebt to a new value keeping the real number of allocated
|
** set GCdebt to a new value keeping the real number of allocated
|
||||||
** objects (totalobjs - GCdebt) invariant and avoiding overflows in
|
** objects (GCtotalobjs - GCdebt) invariant and avoiding overflows in
|
||||||
** 'totalobjs'.
|
** 'GCtotalobjs'.
|
||||||
*/
|
*/
|
||||||
void luaE_setdebt (global_State *g, l_obj debt) {
|
void luaE_setdebt (global_State *g, l_obj debt) {
|
||||||
l_obj tb = gettotalobjs(g);
|
l_obj tb = gettotalobjs(g);
|
||||||
lua_assert(tb > 0);
|
lua_assert(tb > 0);
|
||||||
if (debt > MAX_LOBJ - tb)
|
if (debt > MAX_LOBJ - tb)
|
||||||
debt = MAX_LOBJ - tb; /* will make 'totalobjs == MAX_LMEM' */
|
debt = MAX_LOBJ - tb; /* will make GCtotalobjs == MAX_LOBJ */
|
||||||
g->totalobjs = tb + debt;
|
g->GCtotalobjs = tb + debt;
|
||||||
g->GCdebt = debt;
|
g->GCdebt = debt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,7 +269,7 @@ static void close_state (lua_State *L) {
|
|||||||
}
|
}
|
||||||
luaM_freearray(L, G(L)->strt.hash, cast_sizet(G(L)->strt.size));
|
luaM_freearray(L, G(L)->strt.hash, cast_sizet(G(L)->strt.size));
|
||||||
freestack(L);
|
freestack(L);
|
||||||
lua_assert(g->totalbytes == sizeof(LG));
|
lua_assert(g->GCtotalbytes == sizeof(LG));
|
||||||
lua_assert(gettotalobjs(g) == 1);
|
lua_assert(gettotalobjs(g) == 1);
|
||||||
(*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */
|
(*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */
|
||||||
}
|
}
|
||||||
@ -378,9 +378,9 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud, unsigned seed) {
|
|||||||
g->gray = g->grayagain = NULL;
|
g->gray = g->grayagain = NULL;
|
||||||
g->weak = g->ephemeron = g->allweak = NULL;
|
g->weak = g->ephemeron = g->allweak = NULL;
|
||||||
g->twups = NULL;
|
g->twups = NULL;
|
||||||
g->totalbytes = sizeof(LG);
|
g->GCtotalbytes = sizeof(LG);
|
||||||
g->totalobjs = 1;
|
g->GCtotalobjs = 1;
|
||||||
g->marked = 0;
|
g->GCmarked = 0;
|
||||||
g->GCdebt = 0;
|
g->GCdebt = 0;
|
||||||
setivalue(&g->nilvalue, 0); /* to signal that state is not yet built */
|
setivalue(&g->nilvalue, 0); /* to signal that state is not yet built */
|
||||||
setgcparam(g, PAUSE, LUAI_GCPAUSE);
|
setgcparam(g, PAUSE, LUAI_GCPAUSE);
|
||||||
|
8
lstate.h
8
lstate.h
@ -274,10 +274,10 @@ struct CallInfo {
|
|||||||
typedef struct global_State {
|
typedef struct global_State {
|
||||||
lua_Alloc frealloc; /* function to reallocate memory */
|
lua_Alloc frealloc; /* function to reallocate memory */
|
||||||
void *ud; /* auxiliary data to 'frealloc' */
|
void *ud; /* auxiliary data to 'frealloc' */
|
||||||
lu_mem totalbytes; /* number of bytes currently allocated */
|
lu_mem GCtotalbytes; /* number of bytes currently allocated */
|
||||||
l_obj totalobjs; /* total number of objects allocated + GCdebt */
|
l_obj GCtotalobjs; /* total number of objects allocated + GCdebt */
|
||||||
l_obj GCdebt; /* objects counted but not yet allocated */
|
l_obj GCdebt; /* objects counted but not yet allocated */
|
||||||
l_obj marked; /* number of objects marked in a GC cycle */
|
l_obj GCmarked; /* number of objects marked in a GC cycle */
|
||||||
l_obj GCmajorminor; /* auxiliary counter to control major-minor shifts */
|
l_obj GCmajorminor; /* auxiliary counter to control major-minor shifts */
|
||||||
stringtable strt; /* hash table for strings */
|
stringtable strt; /* hash table for strings */
|
||||||
TValue l_registry;
|
TValue l_registry;
|
||||||
@ -412,7 +412,7 @@ union GCUnion {
|
|||||||
|
|
||||||
|
|
||||||
/* actual number of total objects allocated */
|
/* actual number of total objects allocated */
|
||||||
#define gettotalobjs(g) ((g)->totalobjs - (g)->GCdebt)
|
#define gettotalobjs(g) ((g)->GCtotalobjs - (g)->GCdebt)
|
||||||
|
|
||||||
|
|
||||||
LUAI_FUNC void luaE_setdebt (global_State *g, l_obj debt);
|
LUAI_FUNC void luaE_setdebt (global_State *g, l_obj debt);
|
||||||
|
Loading…
Reference in New Issue
Block a user