From df429f163ada6581d921e7f51b016f1abfeefddd Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Tue, 9 Dec 2003 14:56:11 -0200 Subject: First version of incremental GC --- lgc.h | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'lgc.h') diff --git a/lgc.h b/lgc.h index 9193e2cb..ff1e1115 100644 --- a/lgc.h +++ b/lgc.h @@ -1,5 +1,5 @@ /* -** $Id: lgc.h,v 1.26 2003/12/03 20:03:07 roberto Exp roberto $ +** $Id: lgc.h,v 1.27 2003/12/04 17:22:42 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -58,18 +58,37 @@ #define FIXEDBIT 5 +#define iswhite(x) test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT) +#define isblack(x) testbit((x)->gch.marked, BLACKBIT) + + +#define otherwhite(g) (g->currentwhite ^ bit2mask(WHITE0BIT, WHITE1BIT)) +#define isdead(g,v) ((v)->gch.marked & otherwhite(g)) + +#define changewhite(x) ((x)->gch.marked ^= bit2mask(WHITE0BIT, WHITE1BIT)) + +#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) + #define luaC_white(g) cast(lu_byte, (g)->currentwhite) #define luaC_checkGC(L) { if (G(L)->nblocks >= G(L)->GCthreshold) \ - luaC_collectgarbage(L); } + luaC_step(L); } + + +#define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(valtogco(p))) \ + luaC_barrierf(L,valtogco(p),gcvalue(v)); } +#define luaC_objbarrier(L,p,o) \ + { if (iswhite(valtogco(o)) && isblack(valtogco(p))) \ + luaC_barrierf(L,valtogco(p),valtogco(o)); } size_t luaC_separateudata (lua_State *L); void luaC_callGCTM (lua_State *L); void luaC_sweepall (lua_State *L); -void luaC_collectgarbage (lua_State *L); +void luaC_step (lua_State *L); void luaC_link (lua_State *L, GCObject *o, lu_byte tt); +void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v); #endif -- cgit v1.2.3-55-g6feb