aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-04-24 13:59:26 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-04-24 13:59:26 -0300
commit69371c4b84becac09c445aae01d005b49658ef82 (patch)
tree03b0b5df405dbd77b481e98ccd67d46c166d492b /lgc.c
parent6a98aa0bb0426acdf4a9ef75b1d3200fd972e77d (diff)
downloadlua-69371c4b84becac09c445aae01d005b49658ef82.tar.gz
lua-69371c4b84becac09c445aae01d005b49658ef82.tar.bz2
lua-69371c4b84becac09c445aae01d005b49658ef82.zip
'KGC_NORMAL' -> 'KGC_INC' + emergency GC signalled by flag (instead
of mode)
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/lgc.c b/lgc.c
index 59b6dde1..d27ea42b 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 2.223 2017/04/19 17:02:50 roberto Exp roberto $ 2** $Id: lgc.c,v 2.224 2017/04/20 18:24:33 roberto Exp roberto $
3** Garbage Collector 3** Garbage Collector
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -543,7 +543,7 @@ static lu_mem traversethread (global_State *g, lua_State *th) {
543 g->twups = th; 543 g->twups = th;
544 } 544 }
545 } 545 }
546 else if (g->gckind != KGC_EMERGENCY) 546 else if (!g->gcemergency)
547 luaD_shrinkstack(th); /* do not change stack in emergency cycle */ 547 luaD_shrinkstack(th); /* do not change stack in emergency cycle */
548 return (sizeof(lua_State) + sizeof(TValue) * th->stacksize + 548 return (sizeof(lua_State) + sizeof(TValue) * th->stacksize +
549 sizeof(CallInfo) * th->nci); 549 sizeof(CallInfo) * th->nci);
@@ -767,7 +767,7 @@ static GCObject **sweeptolive (lua_State *L, GCObject **p) {
767** If possible, shrink string table 767** If possible, shrink string table
768*/ 768*/
769static void checkSizes (lua_State *L, global_State *g) { 769static void checkSizes (lua_State *L, global_State *g) {
770 if (g->gckind != KGC_EMERGENCY) { 770 if (!g->gcemergency) {
771 l_mem olddebt = g->GCdebt; 771 l_mem olddebt = g->GCdebt;
772 if (g->strt.nuse < g->strt.size / 4) /* string table too big? */ 772 if (g->strt.nuse < g->strt.size / 4) /* string table too big? */
773 luaS_resize(L, g->strt.size / 2); /* shrink it a little */ 773 luaS_resize(L, g->strt.size / 2); /* shrink it a little */
@@ -1174,7 +1174,7 @@ static void enterinc (global_State *g) {
1174 g->finobjrold = g->finobjold = g->finobjsur = NULL; 1174 g->finobjrold = g->finobjold = g->finobjsur = NULL;
1175 lua_assert(g->tobefnz == NULL); /* no need to sweep */ 1175 lua_assert(g->tobefnz == NULL); /* no need to sweep */
1176 g->gcstate = GCSpause; 1176 g->gcstate = GCSpause;
1177 g->gckind = KGC_NORMAL; 1177 g->gckind = KGC_INC;
1178} 1178}
1179 1179
1180 1180
@@ -1278,7 +1278,7 @@ static void deletealllist (lua_State *L, GCObject *p, GCObject *limit) {
1278 1278
1279void luaC_freeallobjects (lua_State *L) { 1279void luaC_freeallobjects (lua_State *L) {
1280 global_State *g = G(L); 1280 global_State *g = G(L);
1281 luaC_changemode(L, KGC_NORMAL); 1281 luaC_changemode(L, KGC_INC);
1282 separatetobefnz(g, 1); /* separate all objects with finalizers */ 1282 separatetobefnz(g, 1); /* separate all objects with finalizers */
1283 lua_assert(g->finobj == NULL); 1283 lua_assert(g->finobj == NULL);
1284 callallpendingfinalizers(L); 1284 callallpendingfinalizers(L);
@@ -1394,7 +1394,7 @@ static lu_mem singlestep (lua_State *L) {
1394 return 0; 1394 return 0;
1395 } 1395 }
1396 case GCScallfin: { /* call remaining finalizers */ 1396 case GCScallfin: { /* call remaining finalizers */
1397 if (g->tobefnz && g->gckind != KGC_EMERGENCY) { 1397 if (g->tobefnz && !g->gcemergency) {
1398 int n = runafewfinalizers(L); 1398 int n = runafewfinalizers(L);
1399 return (n * GCFINALIZECOST); 1399 return (n * GCFINALIZECOST);
1400 } 1400 }
@@ -1459,7 +1459,7 @@ void luaC_step (lua_State *L) {
1459 global_State *g = G(L); 1459 global_State *g = G(L);
1460 if (!g->gcrunning) /* not running? */ 1460 if (!g->gcrunning) /* not running? */
1461 luaE_setdebt(g, -GCSTEPSIZE * 10); /* avoid being called too often */ 1461 luaE_setdebt(g, -GCSTEPSIZE * 10); /* avoid being called too often */
1462 else if (g->gckind == KGC_NORMAL) 1462 else if (g->gckind == KGC_INC)
1463 incstep(L, g); 1463 incstep(L, g);
1464 else 1464 else
1465 genstep(L, g); 1465 genstep(L, g);
@@ -1490,14 +1490,13 @@ static void fullinc (lua_State *L, global_State *g) {
1490 1490
1491void luaC_fullgc (lua_State *L, int isemergency) { 1491void luaC_fullgc (lua_State *L, int isemergency) {
1492 global_State *g = G(L); 1492 global_State *g = G(L);
1493 int gckind = g->gckind; 1493 lua_assert(!g->gcemergency);
1494 if (isemergency) 1494 g->gcemergency = isemergency; /* set flag */
1495 g->gckind = KGC_EMERGENCY; /* set flag */ 1495 if (g->gckind == KGC_INC)
1496 if (gckind == KGC_NORMAL)
1497 fullinc(L, g); 1496 fullinc(L, g);
1498 else 1497 else
1499 fullgen(L, g); 1498 fullgen(L, g);
1500 g->gckind = gckind; 1499 g->gcemergency = 0;
1501} 1500}
1502 1501
1503/* }====================================================== */ 1502/* }====================================================== */