misc/liblua/lgc.h
changeset 2812 0a24853de796
child 10017 de822cd3df3a
equal deleted inserted replaced
2811:4cad87e11bf6 2812:0a24853de796
       
     1 /*
       
     2 ** $Id: lgc.h,v 2.15.1.1 2007/12/27 13:02:25 roberto Exp $
       
     3 ** Garbage Collector
       
     4 ** See Copyright Notice in lua.h
       
     5 */
       
     6 
       
     7 #ifndef lgc_h
       
     8 #define lgc_h
       
     9 
       
    10 
       
    11 #include "lobject.h"
       
    12 
       
    13 
       
    14 /*
       
    15 ** Possible states of the Garbage Collector
       
    16 */
       
    17 #define GCSpause	0
       
    18 #define GCSpropagate	1
       
    19 #define GCSsweepstring	2
       
    20 #define GCSsweep	3
       
    21 #define GCSfinalize	4
       
    22 
       
    23 
       
    24 /*
       
    25 ** some userful bit tricks
       
    26 */
       
    27 #define resetbits(x,m)	((x) &= cast(lu_byte, ~(m)))
       
    28 #define setbits(x,m)	((x) |= (m))
       
    29 #define testbits(x,m)	((x) & (m))
       
    30 #define bitmask(b)	(1<<(b))
       
    31 #define bit2mask(b1,b2)	(bitmask(b1) | bitmask(b2))
       
    32 #define l_setbit(x,b)	setbits(x, bitmask(b))
       
    33 #define resetbit(x,b)	resetbits(x, bitmask(b))
       
    34 #define testbit(x,b)	testbits(x, bitmask(b))
       
    35 #define set2bits(x,b1,b2)	setbits(x, (bit2mask(b1, b2)))
       
    36 #define reset2bits(x,b1,b2)	resetbits(x, (bit2mask(b1, b2)))
       
    37 #define test2bits(x,b1,b2)	testbits(x, (bit2mask(b1, b2)))
       
    38 
       
    39 
       
    40 
       
    41 /*
       
    42 ** Layout for bit use in `marked' field:
       
    43 ** bit 0 - object is white (type 0)
       
    44 ** bit 1 - object is white (type 1)
       
    45 ** bit 2 - object is black
       
    46 ** bit 3 - for userdata: has been finalized
       
    47 ** bit 3 - for tables: has weak keys
       
    48 ** bit 4 - for tables: has weak values
       
    49 ** bit 5 - object is fixed (should not be collected)
       
    50 ** bit 6 - object is "super" fixed (only the main thread)
       
    51 */
       
    52 
       
    53 
       
    54 #define WHITE0BIT	0
       
    55 #define WHITE1BIT	1
       
    56 #define BLACKBIT	2
       
    57 #define FINALIZEDBIT	3
       
    58 #define KEYWEAKBIT	3
       
    59 #define VALUEWEAKBIT	4
       
    60 #define FIXEDBIT	5
       
    61 #define SFIXEDBIT	6
       
    62 #define WHITEBITS	bit2mask(WHITE0BIT, WHITE1BIT)
       
    63 
       
    64 
       
    65 #define iswhite(x)      test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT)
       
    66 #define isblack(x)      testbit((x)->gch.marked, BLACKBIT)
       
    67 #define isgray(x)	(!isblack(x) && !iswhite(x))
       
    68 
       
    69 #define otherwhite(g)	(g->currentwhite ^ WHITEBITS)
       
    70 #define isdead(g,v)	((v)->gch.marked & otherwhite(g) & WHITEBITS)
       
    71 
       
    72 #define changewhite(x)	((x)->gch.marked ^= WHITEBITS)
       
    73 #define gray2black(x)	l_setbit((x)->gch.marked, BLACKBIT)
       
    74 
       
    75 #define valiswhite(x)	(iscollectable(x) && iswhite(gcvalue(x)))
       
    76 
       
    77 #define luaC_white(g)	cast(lu_byte, (g)->currentwhite & WHITEBITS)
       
    78 
       
    79 
       
    80 #define luaC_checkGC(L) { \
       
    81   condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); \
       
    82   if (G(L)->totalbytes >= G(L)->GCthreshold) \
       
    83 	luaC_step(L); }
       
    84 
       
    85 
       
    86 #define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p)))  \
       
    87 	luaC_barrierf(L,obj2gco(p),gcvalue(v)); }
       
    88 
       
    89 #define luaC_barriert(L,t,v) { if (valiswhite(v) && isblack(obj2gco(t)))  \
       
    90 	luaC_barrierback(L,t); }
       
    91 
       
    92 #define luaC_objbarrier(L,p,o)  \
       
    93 	{ if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \
       
    94 		luaC_barrierf(L,obj2gco(p),obj2gco(o)); }
       
    95 
       
    96 #define luaC_objbarriert(L,t,o)  \
       
    97    { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) luaC_barrierback(L,t); }
       
    98 
       
    99 LUAI_FUNC size_t luaC_separateudata (lua_State *L, int all);
       
   100 LUAI_FUNC void luaC_callGCTM (lua_State *L);
       
   101 LUAI_FUNC void luaC_freeall (lua_State *L);
       
   102 LUAI_FUNC void luaC_step (lua_State *L);
       
   103 LUAI_FUNC void luaC_fullgc (lua_State *L);
       
   104 LUAI_FUNC void luaC_link (lua_State *L, GCObject *o, lu_byte tt);
       
   105 LUAI_FUNC void luaC_linkupval (lua_State *L, UpVal *uv);
       
   106 LUAI_FUNC void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v);
       
   107 LUAI_FUNC void luaC_barrierback (lua_State *L, Table *t);
       
   108 
       
   109 
       
   110 #endif