| [5181] | 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 | 
|---|