From 88eb901f81d647714d14b6f7e7c6455b46a27daa Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 9 Nov 2009 16:29:21 -0200 Subject: [PATCH] registry and global table may be changed through the API without a write barrier, so GC should visit them in the atomic phase. --- lapi.c | 5 +++-- lgc.c | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lapi.c b/lapi.c index c43f601e..a8eb128c 100644 --- 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 index b6bf9d04..91ed52dd 100644 --- 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);