mirror of https://github.com/rusefi/lua.git
"gray lists" only need to be valid when 'keepinvariant' is true
This commit is contained in:
parent
b9e1dec2cb
commit
4d871ee973
21
lgc.c
21
lgc.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lgc.c,v 2.81 2010/04/29 17:32:40 roberto Exp roberto $
|
** $Id: lgc.c,v 2.82 2010/04/29 21:43:36 roberto Exp roberto $
|
||||||
** Garbage Collector
|
** Garbage Collector
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -23,6 +23,7 @@
|
||||||
#include "ltm.h"
|
#include "ltm.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define GCSTEPSIZE 1024
|
#define GCSTEPSIZE 1024
|
||||||
#define GCSWEEPMAX 40
|
#define GCSWEEPMAX 40
|
||||||
#define GCSWEEPCOST 1
|
#define GCSWEEPCOST 1
|
||||||
|
@ -288,9 +289,8 @@ static void remarkupvals (global_State *g) {
|
||||||
*/
|
*/
|
||||||
static void markroot (lua_State *L) {
|
static void markroot (lua_State *L) {
|
||||||
global_State *g = G(L);
|
global_State *g = G(L);
|
||||||
lua_assert(g->gckind == KGC_GEN ||
|
g->gray = g->grayagain = NULL;
|
||||||
(g->gray == NULL && g->grayagain == NULL && g->weak == NULL &&
|
g->weak = g->allweak = g->ephemeron = NULL;
|
||||||
g->allweak == NULL && g->ephemeron == NULL));
|
|
||||||
markobject(g, g->mainthread);
|
markobject(g, g->mainthread);
|
||||||
markvalue(g, &g->l_registry);
|
markvalue(g, &g->l_registry);
|
||||||
markmt(g);
|
markmt(g);
|
||||||
|
@ -793,11 +793,6 @@ static void atomic (lua_State *L) {
|
||||||
cleartable(g->allweak);
|
cleartable(g->allweak);
|
||||||
lua_checkmemory(L);
|
lua_checkmemory(L);
|
||||||
g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */
|
g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */
|
||||||
if (g->gckind != KGC_GEN) {
|
|
||||||
g->gray = NULL; /* all gray objects will become white */
|
|
||||||
g->grayagain = NULL;
|
|
||||||
g->weak = g->ephemeron = g->allweak = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -907,7 +902,10 @@ static void step (lua_State *L) {
|
||||||
do { /* always perform at least one single step */
|
do { /* always perform at least one single step */
|
||||||
lim -= singlestep(L);
|
lim -= singlestep(L);
|
||||||
} while (lim > 0 && g->gcstate != GCSpause);
|
} while (lim > 0 && g->gcstate != GCSpause);
|
||||||
g->GCdebt += (g->gcstate != GCSpause) ? -GCSTEPSIZE : stddebt(g);
|
if (g->gcstate != GCSpause)
|
||||||
|
g->GCdebt -= GCSTEPSIZE;
|
||||||
|
else
|
||||||
|
g->GCdebt = stddebt(g);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -931,9 +929,6 @@ void luaC_fullgc (lua_State *L, int isemergency) {
|
||||||
(as white has not changed, nothing will be collected) */
|
(as white has not changed, nothing will be collected) */
|
||||||
g->sweepstrgc = 0;
|
g->sweepstrgc = 0;
|
||||||
g->gcstate = GCSsweepstring;
|
g->gcstate = GCSsweepstring;
|
||||||
g->gray = NULL;
|
|
||||||
g->grayagain = NULL;
|
|
||||||
g->weak = g->ephemeron = g->allweak = NULL;
|
|
||||||
}
|
}
|
||||||
/* finish any pending sweep phase */
|
/* finish any pending sweep phase */
|
||||||
luaC_runtilstate(L, bit2mask(GCSpause, GCSfinalize));
|
luaC_runtilstate(L, bit2mask(GCSpause, GCSfinalize));
|
||||||
|
|
5
ltests.c
5
ltests.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: ltests.c,v 2.97 2010/04/29 17:33:51 roberto Exp roberto $
|
** $Id: ltests.c,v 2.98 2010/04/29 21:42:33 roberto Exp roberto $
|
||||||
** Internal Module for Debugging of the Lua Implementation
|
** Internal Module for Debugging of the Lua Implementation
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -380,6 +380,7 @@ static void checkgraylist (GCObject *l) {
|
||||||
|
|
||||||
|
|
||||||
static void markgrays (global_State *g) {
|
static void markgrays (global_State *g) {
|
||||||
|
if (!keepinvariant(g)) return;
|
||||||
checkgraylist(g->gray);
|
checkgraylist(g->gray);
|
||||||
checkgraylist(g->grayagain);
|
checkgraylist(g->grayagain);
|
||||||
checkgraylist(g->weak);
|
checkgraylist(g->weak);
|
||||||
|
@ -399,7 +400,7 @@ int lua_checkmemory (lua_State *L) {
|
||||||
for (o = g->allgc; o != NULL; o = gch(o)->next) {
|
for (o = g->allgc; o != NULL; o = gch(o)->next) {
|
||||||
checkobject(g, o);
|
checkobject(g, o);
|
||||||
if (isgray(o)) {
|
if (isgray(o)) {
|
||||||
lua_assert(issweepphase(g) || testbit(o->gch.marked, GRAYBIT));
|
lua_assert(!keepinvariant(g) || testbit(o->gch.marked, GRAYBIT));
|
||||||
o->gch.marked = resetbit(o->gch.marked, GRAYBIT);
|
o->gch.marked = resetbit(o->gch.marked, GRAYBIT);
|
||||||
}
|
}
|
||||||
lua_assert(!testbit(o->gch.marked, SEPARATED));
|
lua_assert(!testbit(o->gch.marked, SEPARATED));
|
||||||
|
|
Loading…
Reference in New Issue