diff options
Diffstat (limited to 'src/lgc.h')
| -rw-r--r-- | src/lgc.h | 23 |
1 files changed, 14 insertions, 9 deletions
@@ -1,5 +1,5 @@ /* -** $Id: lgc.h,v 2.9 2004/09/15 20:38:15 roberto Exp $ +** $Id: lgc.h,v 2.12 2005/02/23 17:30:22 roberto Exp $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -29,7 +29,7 @@ #define testbits(x,m) ((x) & (m)) #define bitmask(b) (1<<(b)) #define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2)) -#define setbit(x,b) setbits(x, bitmask(b)) +#define l_setbit(x,b) setbits(x, bitmask(b)) #define resetbit(x,b) resetbits(x, bitmask(b)) #define testbit(x,b) testbits(x, bitmask(b)) #define set2bits(x,b1,b2) setbits(x, (bit2mask(b1, b2))) @@ -47,8 +47,10 @@ ** bit 3 - for tables: has weak keys ** bit 4 - for tables: has weak values ** bit 5 - object is fixed (should not be collected) +** bit 6 - object is "super" fixed (only the main thread) */ + #define WHITE0BIT 0 #define WHITE1BIT 1 #define BLACKBIT 2 @@ -56,20 +58,23 @@ #define KEYWEAKBIT 3 #define VALUEWEAKBIT 4 #define FIXEDBIT 5 +#define SFIXEDBIT 6 +#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) #define iswhite(x) test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT) #define isblack(x) testbit((x)->gch.marked, BLACKBIT) #define isgray(x) (!isblack(x) && !iswhite(x)) -#define otherwhite(g) (g->currentwhite ^ bit2mask(WHITE0BIT, WHITE1BIT)) -#define isdead(g,v) ((v)->gch.marked & otherwhite(g)) +#define otherwhite(g) (g->currentwhite ^ WHITEBITS) +#define isdead(g,v) ((v)->gch.marked & otherwhite(g) & WHITEBITS) -#define changewhite(x) ((x)->gch.marked ^= bit2mask(WHITE0BIT, WHITE1BIT)) +#define changewhite(x) ((x)->gch.marked ^= WHITEBITS) +#define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) #define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) -#define luaC_white(g) cast(lu_byte, (g)->currentwhite) +#define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) #define luaC_checkGC(L) { if (G(L)->totalbytes >= G(L)->GCthreshold) \ @@ -80,7 +85,7 @@ luaC_barrierf(L,obj2gco(p),gcvalue(v)); } #define luaC_barriert(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \ - luaC_barrierback(L,obj2gco(p),gcvalue(v)); } + luaC_barrierback(L,obj2gco(p)); } #define luaC_objbarrier(L,p,o) \ { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \ @@ -88,7 +93,7 @@ #define luaC_objbarriert(L,p,o) \ { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \ - luaC_barrierback(L,obj2gco(p),obj2gco(o)); } + luaC_barrierback(L,obj2gco(p)); } size_t luaC_separateudata (lua_State *L, int all); void luaC_callGCTM (lua_State *L); @@ -98,7 +103,7 @@ void luaC_fullgc (lua_State *L); void luaC_link (lua_State *L, GCObject *o, lu_byte tt); void luaC_linkupval (lua_State *L, UpVal *uv); void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v); -void luaC_barrierback (lua_State *L, GCObject *o, GCObject *v); +void luaC_barrierback (lua_State *L, GCObject *o); #endif |
