summaryrefslogtreecommitdiff
path: root/src/lua51/lgc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua51/lgc.h')
-rw-r--r--src/lua51/lgc.h44
1 files changed, 24 insertions, 20 deletions
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);