lua

A copy of the Lua development repository
Log | Files | Refs | README

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:
Mlapi.c | 5+++--
Mlgc.c | 5++++-
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);