misc/liblua/lgc.h
changeset 10017 de822cd3df3a
parent 2812 0a24853de796
equal deleted inserted replaced
10015:4feced261c68 10017:de822cd3df3a
    12 
    12 
    13 
    13 
    14 /*
    14 /*
    15 ** Possible states of the Garbage Collector
    15 ** Possible states of the Garbage Collector
    16 */
    16 */
    17 #define GCSpause	0
    17 #define GCSpause    0
    18 #define GCSpropagate	1
    18 #define GCSpropagate    1
    19 #define GCSsweepstring	2
    19 #define GCSsweepstring  2
    20 #define GCSsweep	3
    20 #define GCSsweep    3
    21 #define GCSfinalize	4
    21 #define GCSfinalize 4
    22 
    22 
    23 
    23 
    24 /*
    24 /*
    25 ** some userful bit tricks
    25 ** some userful bit tricks
    26 */
    26 */
    27 #define resetbits(x,m)	((x) &= cast(lu_byte, ~(m)))
    27 #define resetbits(x,m)  ((x) &= cast(lu_byte, ~(m)))
    28 #define setbits(x,m)	((x) |= (m))
    28 #define setbits(x,m)    ((x) |= (m))
    29 #define testbits(x,m)	((x) & (m))
    29 #define testbits(x,m)   ((x) & (m))
    30 #define bitmask(b)	(1<<(b))
    30 #define bitmask(b)  (1<<(b))
    31 #define bit2mask(b1,b2)	(bitmask(b1) | bitmask(b2))
    31 #define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2))
    32 #define l_setbit(x,b)	setbits(x, bitmask(b))
    32 #define l_setbit(x,b)   setbits(x, bitmask(b))
    33 #define resetbit(x,b)	resetbits(x, bitmask(b))
    33 #define resetbit(x,b)   resetbits(x, bitmask(b))
    34 #define testbit(x,b)	testbits(x, bitmask(b))
    34 #define testbit(x,b)    testbits(x, bitmask(b))
    35 #define set2bits(x,b1,b2)	setbits(x, (bit2mask(b1, b2)))
    35 #define set2bits(x,b1,b2)   setbits(x, (bit2mask(b1, b2)))
    36 #define reset2bits(x,b1,b2)	resetbits(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)))
    37 #define test2bits(x,b1,b2)  testbits(x, (bit2mask(b1, b2)))
    38 
    38 
    39 
    39 
    40 
    40 
    41 /*
    41 /*
    42 ** Layout for bit use in `marked' field:
    42 ** Layout for bit use in `marked' field:
    49 ** bit 5 - object is fixed (should not be collected)
    49 ** bit 5 - object is fixed (should not be collected)
    50 ** bit 6 - object is "super" fixed (only the main thread)
    50 ** bit 6 - object is "super" fixed (only the main thread)
    51 */
    51 */
    52 
    52 
    53 
    53 
    54 #define WHITE0BIT	0
    54 #define WHITE0BIT   0
    55 #define WHITE1BIT	1
    55 #define WHITE1BIT   1
    56 #define BLACKBIT	2
    56 #define BLACKBIT    2
    57 #define FINALIZEDBIT	3
    57 #define FINALIZEDBIT    3
    58 #define KEYWEAKBIT	3
    58 #define KEYWEAKBIT  3
    59 #define VALUEWEAKBIT	4
    59 #define VALUEWEAKBIT    4
    60 #define FIXEDBIT	5
    60 #define FIXEDBIT    5
    61 #define SFIXEDBIT	6
    61 #define SFIXEDBIT   6
    62 #define WHITEBITS	bit2mask(WHITE0BIT, WHITE1BIT)
    62 #define WHITEBITS   bit2mask(WHITE0BIT, WHITE1BIT)
    63 
    63 
    64 
    64 
    65 #define iswhite(x)      test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT)
    65 #define iswhite(x)      test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT)
    66 #define isblack(x)      testbit((x)->gch.marked, BLACKBIT)
    66 #define isblack(x)      testbit((x)->gch.marked, BLACKBIT)
    67 #define isgray(x)	(!isblack(x) && !iswhite(x))
    67 #define isgray(x)   (!isblack(x) && !iswhite(x))
    68 
    68 
    69 #define otherwhite(g)	(g->currentwhite ^ WHITEBITS)
    69 #define otherwhite(g)   (g->currentwhite ^ WHITEBITS)
    70 #define isdead(g,v)	((v)->gch.marked & otherwhite(g) & WHITEBITS)
    70 #define isdead(g,v) ((v)->gch.marked & otherwhite(g) & WHITEBITS)
    71 
    71 
    72 #define changewhite(x)	((x)->gch.marked ^= WHITEBITS)
    72 #define changewhite(x)  ((x)->gch.marked ^= WHITEBITS)
    73 #define gray2black(x)	l_setbit((x)->gch.marked, BLACKBIT)
    73 #define gray2black(x)   l_setbit((x)->gch.marked, BLACKBIT)
    74 
    74 
    75 #define valiswhite(x)	(iscollectable(x) && iswhite(gcvalue(x)))
    75 #define valiswhite(x)   (iscollectable(x) && iswhite(gcvalue(x)))
    76 
    76 
    77 #define luaC_white(g)	cast(lu_byte, (g)->currentwhite & WHITEBITS)
    77 #define luaC_white(g)   cast(lu_byte, (g)->currentwhite & WHITEBITS)
    78 
    78 
    79 
    79 
    80 #define luaC_checkGC(L) { \
    80 #define luaC_checkGC(L) { \
    81   condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); \
    81   condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); \
    82   if (G(L)->totalbytes >= G(L)->GCthreshold) \
    82   if (G(L)->totalbytes >= G(L)->GCthreshold) \
    83 	luaC_step(L); }
    83     luaC_step(L); }
    84 
    84 
    85 
    85 
    86 #define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p)))  \
    86 #define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p)))  \
    87 	luaC_barrierf(L,obj2gco(p),gcvalue(v)); }
    87     luaC_barrierf(L,obj2gco(p),gcvalue(v)); }
    88 
    88 
    89 #define luaC_barriert(L,t,v) { if (valiswhite(v) && isblack(obj2gco(t)))  \
    89 #define luaC_barriert(L,t,v) { if (valiswhite(v) && isblack(obj2gco(t)))  \
    90 	luaC_barrierback(L,t); }
    90     luaC_barrierback(L,t); }
    91 
    91 
    92 #define luaC_objbarrier(L,p,o)  \
    92 #define luaC_objbarrier(L,p,o)  \
    93 	{ if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \
    93     { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \
    94 		luaC_barrierf(L,obj2gco(p),obj2gco(o)); }
    94         luaC_barrierf(L,obj2gco(p),obj2gco(o)); }
    95 
    95 
    96 #define luaC_objbarriert(L,t,o)  \
    96 #define luaC_objbarriert(L,t,o)  \
    97    { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) luaC_barrierback(L,t); }
    97    { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) luaC_barrierback(L,t); }
    98 
    98 
    99 LUAI_FUNC size_t luaC_separateudata (lua_State *L, int all);
    99 LUAI_FUNC size_t luaC_separateudata (lua_State *L, int all);