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 | /* }====================================================== */ |
