00001
00002
00003
00004
00005
00006
00007 #ifndef lgc_h
00008 #define lgc_h
00009
00010
00011 #include "lobject.h"
00012 #include "lstate.h"
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #define GCSpropagate 0
00032 #define GCSatomic 1
00033 #define GCSsweepstring 2
00034 #define GCSsweepudata 3
00035 #define GCSsweep 4
00036 #define GCSpause 5
00037
00038
00039 #define issweepphase(g) \
00040 (GCSsweepstring <= (g)->gcstate && (g)->gcstate <= GCSsweep)
00041
00042 #define isgenerational(g) ((g)->gckind == KGC_GEN)
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #define keepinvariant(g) (isgenerational(g) || g->gcstate <= GCSatomic)
00053
00054
00055
00056
00057
00058 #define resetbits(x,m) ((x) &= cast(lu_byte, ~(m)))
00059 #define setbits(x,m) ((x) |= (m))
00060 #define testbits(x,m) ((x) & (m))
00061 #define bitmask(b) (1<<(b))
00062 #define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2))
00063 #define l_setbit(x,b) setbits(x, bitmask(b))
00064 #define resetbit(x,b) resetbits(x, bitmask(b))
00065 #define testbit(x,b) testbits(x, bitmask(b))
00066
00067
00068
00069 #define WHITE0BIT 0
00070 #define WHITE1BIT 1
00071 #define BLACKBIT 2
00072 #define FINALIZEDBIT 3
00073 #define SEPARATED 4
00074 #define FIXEDBIT 5
00075 #define OLDBIT 6
00076
00077
00078 #define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT)
00079
00080
00081 #define iswhite(x) testbits((x)->gch.marked, WHITEBITS)
00082 #define isblack(x) testbit((x)->gch.marked, BLACKBIT)
00083 #define isgray(x) \
00084 (!testbits((x)->gch.marked, WHITEBITS | bitmask(BLACKBIT)))
00085
00086 #define isold(x) testbit((x)->gch.marked, OLDBIT)
00087
00088
00089
00090 #define resetoldbit(o) resetbit((o)->gch.marked, OLDBIT)
00091
00092 #define otherwhite(g) (g->currentwhite ^ WHITEBITS)
00093 #define isdeadm(ow,m) (!(((m) ^ WHITEBITS) & (ow)))
00094 #define isdead(g,v) isdeadm(otherwhite(g), (v)->gch.marked)
00095
00096 #define changewhite(x) ((x)->gch.marked ^= WHITEBITS)
00097 #define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT)
00098
00099 #define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x)))
00100
00101 #define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS)
00102
00103
00104 #define luaC_condGC(L,c) \
00105 {if (G(L)->GCdebt > 0) {c;}; condchangemem(L);}
00106 #define luaC_checkGC(L) luaC_condGC(L, luaC_step(L);)
00107
00108
00109 #define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \
00110 luaC_barrier_(L,obj2gco(p),gcvalue(v)); }
00111
00112 #define luaC_barrierback(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \
00113 luaC_barrierback_(L,p); }
00114
00115 #define luaC_objbarrier(L,p,o) \
00116 { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \
00117 luaC_barrier_(L,obj2gco(p),obj2gco(o)); }
00118
00119 #define luaC_objbarrierback(L,p,o) \
00120 { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) luaC_barrierback_(L,p); }
00121
00122 #define luaC_barrierproto(L,p,c) \
00123 { if (isblack(obj2gco(p))) luaC_barrierproto_(L,p,c); }
00124
00125 LUAI_FUNC void luaC_freeallobjects (lua_State *L);
00126 LUAI_FUNC void luaC_step (lua_State *L);
00127 LUAI_FUNC void luaC_forcestep (lua_State *L);
00128 LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask);
00129 LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency);
00130 LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz,
00131 GCObject **list, int offset);
00132 LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v);
00133 LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o);
00134 LUAI_FUNC void luaC_barrierproto_ (lua_State *L, Proto *p, Closure *c);
00135 LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt);
00136 LUAI_FUNC void luaC_checkupvalcolor (global_State *g, UpVal *uv);
00137 LUAI_FUNC void luaC_changemode (lua_State *L, int mode);
00138
00139 #endif