From 63cb4fbbb961da133c68865845eaf22d9b876700 Mon Sep 17 00:00:00 2001 From: chai Date: Sun, 27 Sep 2020 20:31:53 +0800 Subject: *misc --- src/lua51/lgc.h | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) (limited to 'src/lua51/lgc.h') diff --git a/src/lua51/lgc.h b/src/lua51/lgc.h index 83007ac..8a23239 100644 --- a/src/lua51/lgc.h +++ b/src/lua51/lgc.h @@ -11,15 +11,18 @@ #include "lobject.h" +#include "misc.h" - +//c! GC的几个阶段 +// 时序上: +// GCSpause > GCSpropagate > GCSsweepstring > GCSsweep > GCSfinalize /* ** Possible states of the Garbage Collector */ -#define GCSpause 0 // 暂停 -#define GCSpropagate 1 // 扫描,正在遍历灰色节点,检查引用情况 +#define GCSpause 0 // 开始 +#define GCSpropagate 1 // 扫描标记,遍历*灰色*节点,检查引用情况 #define GCSsweepstring 2 // 字符串回收阶段 -#define GCSsweep 3 // 除了字符串的其他对象的回收阶段 +#define GCSsweep 3 // 非字符串GC对象的回收 #define GCSfinalize 4 // 终止阶段 @@ -51,19 +54,18 @@ ** bit 5 - object is fixed (should not be collected) ** bit 6 - object is "super" fixed (only the main thread) */ - - -#define WHITE0BIT 0 // 01 -#define WHITE1BIT 1 // 10 -#define BLACKBIT 2 -#define FINALIZEDBIT 3 //标记没有被引用的udata -#define KEYWEAKBIT 3 //标记弱表的key +// 这里不需要一个灰色的bit,非白非黑就是灰色 +#define WHITE0BIT 0 // 01 +#define WHITE1BIT 1 // 10 +#define BLACKBIT 2 // 黑色 +#define FINALIZEDBIT 3 // 标记没有被引用的udata +#define KEYWEAKBIT 3 // 标记弱表的key #define VALUEWEAKBIT 4 // 标记弱表的value -#define FIXEDBIT 5 // 标记lua_state主线程对象不可回收 -#define SFIXEDBIT 6 // 标记lua关键字不要回收 +#define FIXEDBIT 5 // 仅用于标记lua_state主线程对象不可回收 +#define SFIXEDBIT 6 // 标记lua关键字字符串不要回收 #define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) // 结果是11 - +//region 与颜色相关的宏 #define iswhite(x) test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT) #define isblack(x) testbit((x)->gch.marked, BLACKBIT) #define isgray(x) (!isblack(x) && !iswhite(x)) @@ -71,16 +73,15 @@ #define otherwhite(g) (g->currentwhite ^ WHITEBITS) #define isdead(g,v) ((v)->gch.marked & otherwhite(g) & WHITEBITS) -#define changewhite(x) ((x)->gch.marked ^= WHITEBITS) +#define changewhite(x) ((x)->gch.marked ^= WHITEBITS) // 切换white类型 #define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) #define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) -// g->currentwhite & WHITEBITS是 current white -// g->currentwhite ^ WHITEBITS是 otherwhite #define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) +//endregion 与颜色相关的宏 -// 自动触发回收内存,在每次调用内存分配相关API时进行 +//c! 在每次调用内存分配相关API时自动触发回收内存, // 触发条件是当前分配的内存大于阈值GCthreshold // 自动触发不可控,很多人选择关闭它,方法是通过设置一个很大的GCthreshold比如(~0) #define luaC_checkGC(L) { \ @@ -88,8 +89,8 @@ if (G(L)->totalbytes >= G(L)->GCthreshold) \ luaC_step(L); } -//c 避障相关操作,分为向前避障 luaC_barrier luaC_objbarrier 和向后避障 luaC_barriert luaC_objbarriert - +//c 屏障相关操作,分为向前屏障 luaC_barrier luaC_objbarrier 和向后屏障 luaC_barriert luaC_objbarriert +// 向后屏障只针对table类型 #define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \ luaC_barrierf(L,obj2gco(p),gcvalue(v)); } @@ -103,6 +104,9 @@ #define luaC_objbarriert(L,t,o) \ { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) luaC_barrierback(L,t); } + +// API + LUAI_FUNC size_t luaC_separateudata (lua_State *L, int all); LUAI_FUNC void luaC_callGCTM (lua_State *L); LUAI_FUNC void luaC_freeall (lua_State *L); -- cgit v1.1-26-g67d0