|
|
@ -1,5 +1,5 @@ |
|
|
|
/*
|
|
|
|
** $Id: lgc.c,v 2.223 2017/04/19 17:02:50 roberto Exp roberto $ |
|
|
|
** $Id: lgc.c,v 2.224 2017/04/20 18:24:33 roberto Exp roberto $ |
|
|
|
** Garbage Collector |
|
|
|
** See Copyright Notice in lua.h |
|
|
|
*/ |
|
|
@ -543,7 +543,7 @@ static lu_mem traversethread (global_State *g, lua_State *th) { |
|
|
|
g->twups = th; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (g->gckind != KGC_EMERGENCY) |
|
|
|
else if (!g->gcemergency) |
|
|
|
luaD_shrinkstack(th); /* do not change stack in emergency cycle */ |
|
|
|
return (sizeof(lua_State) + sizeof(TValue) * th->stacksize + |
|
|
|
sizeof(CallInfo) * th->nci); |
|
|
@ -767,7 +767,7 @@ static GCObject **sweeptolive (lua_State *L, GCObject **p) { |
|
|
|
** If possible, shrink string table |
|
|
|
*/ |
|
|
|
static void checkSizes (lua_State *L, global_State *g) { |
|
|
|
if (g->gckind != KGC_EMERGENCY) { |
|
|
|
if (!g->gcemergency) { |
|
|
|
l_mem olddebt = g->GCdebt; |
|
|
|
if (g->strt.nuse < g->strt.size / 4) /* string table too big? */ |
|
|
|
luaS_resize(L, g->strt.size / 2); /* shrink it a little */ |
|
|
@ -1174,7 +1174,7 @@ static void enterinc (global_State *g) { |
|
|
|
g->finobjrold = g->finobjold = g->finobjsur = NULL; |
|
|
|
lua_assert(g->tobefnz == NULL); /* no need to sweep */ |
|
|
|
g->gcstate = GCSpause; |
|
|
|
g->gckind = KGC_NORMAL; |
|
|
|
g->gckind = KGC_INC; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -1278,7 +1278,7 @@ static void deletealllist (lua_State *L, GCObject *p, GCObject *limit) { |
|
|
|
|
|
|
|
void luaC_freeallobjects (lua_State *L) { |
|
|
|
global_State *g = G(L); |
|
|
|
luaC_changemode(L, KGC_NORMAL); |
|
|
|
luaC_changemode(L, KGC_INC); |
|
|
|
separatetobefnz(g, 1); /* separate all objects with finalizers */ |
|
|
|
lua_assert(g->finobj == NULL); |
|
|
|
callallpendingfinalizers(L); |
|
|
@ -1394,7 +1394,7 @@ static lu_mem singlestep (lua_State *L) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
case GCScallfin: { /* call remaining finalizers */ |
|
|
|
if (g->tobefnz && g->gckind != KGC_EMERGENCY) { |
|
|
|
if (g->tobefnz && !g->gcemergency) { |
|
|
|
int n = runafewfinalizers(L); |
|
|
|
return (n * GCFINALIZECOST); |
|
|
|
} |
|
|
@ -1459,7 +1459,7 @@ void luaC_step (lua_State *L) { |
|
|
|
global_State *g = G(L); |
|
|
|
if (!g->gcrunning) /* not running? */ |
|
|
|
luaE_setdebt(g, -GCSTEPSIZE * 10); /* avoid being called too often */ |
|
|
|
else if (g->gckind == KGC_NORMAL) |
|
|
|
else if (g->gckind == KGC_INC) |
|
|
|
incstep(L, g); |
|
|
|
else |
|
|
|
genstep(L, g); |
|
|
@ -1490,14 +1490,13 @@ static void fullinc (lua_State *L, global_State *g) { |
|
|
|
|
|
|
|
void luaC_fullgc (lua_State *L, int isemergency) { |
|
|
|
global_State *g = G(L); |
|
|
|
int gckind = g->gckind; |
|
|
|
if (isemergency) |
|
|
|
g->gckind = KGC_EMERGENCY; /* set flag */ |
|
|
|
if (gckind == KGC_NORMAL) |
|
|
|
lua_assert(!g->gcemergency); |
|
|
|
g->gcemergency = isemergency; /* set flag */ |
|
|
|
if (g->gckind == KGC_INC) |
|
|
|
fullinc(L, g); |
|
|
|
else |
|
|
|
fullgen(L, g); |
|
|
|
g->gckind = gckind; |
|
|
|
g->gcemergency = 0; |
|
|
|
} |
|
|
|
|
|
|
|
/* }====================================================== */ |
|
|
|