commit 88eb901f81d647714d14b6f7e7c6455b46a27daa
parent 2583bac3d3dbbe8e5f532c93f33e2c9358b850c1
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Mon, 9 Nov 2009 16:28:57 -0200
registry and global table may be changed through the API without a
write barrier, so GC should visit them in the atomic phase.
Diffstat:
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/lapi.c b/lapi.c
@@ -1,5 +1,5 @@
/*
-** $Id: lapi.c,v 2.96 2009/11/05 17:26:00 roberto Exp roberto $
+** $Id: lapi.c,v 2.97 2009/11/06 17:03:37 roberto Exp roberto $
** Lua API
** See Copyright Notice in lua.h
*/
@@ -199,7 +199,8 @@ static void moveto (lua_State *L, TValue *fr, int idx) {
if (idx < LUA_GLOBALSINDEX) /* function upvalue? */
luaC_barrier(L, curr_func(L), fr);
}
- /* LUA_GLOBALSINDEX does not need gc barrier (threads are never black) */
+ /* LUA_GLOBALSINDEX and LUA_REGISTRYINDEX do not need gc barrier
+ (collector revisits them before finishing collection) */
}
diff --git a/lgc.c b/lgc.c
@@ -1,5 +1,5 @@
/*
-** $Id: lgc.c,v 2.59 2009/11/05 17:43:54 roberto Exp roberto $
+** $Id: lgc.c,v 2.60 2009/11/06 17:06:19 roberto Exp roberto $
** Garbage Collector
** See Copyright Notice in lua.h
*/
@@ -709,6 +709,9 @@ void luaC_freeall (lua_State *L) {
static void atomic (lua_State *L) {
global_State *g = G(L);
size_t udsize; /* total size of userdata to be finalized */
+ /* global table and registry may be changed by API */
+ markvalue(g, &g->l_gt);
+ markvalue(g, &g->l_registry);
/* remark occasional upvalues of (maybe) dead threads */
g->gcstate = GCSatomic;
remarkupvals(g);