diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-04-24 13:59:26 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-04-24 13:59:26 -0300 |
commit | 69371c4b84becac09c445aae01d005b49658ef82 (patch) | |
tree | 03b0b5df405dbd77b481e98ccd67d46c166d492b /lgc.c | |
parent | 6a98aa0bb0426acdf4a9ef75b1d3200fd972e77d (diff) | |
download | lua-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.c | 23 |
1 files changed, 11 insertions, 12 deletions
@@ -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 | */ |
769 | static void checkSizes (lua_State *L, global_State *g) { | 769 | static 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 | ||
1279 | void luaC_freeallobjects (lua_State *L) { | 1279 | void 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 | ||
1491 | void luaC_fullgc (lua_State *L, int isemergency) { | 1491 | void 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 | /* }====================================================== */ |