diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2006-05-24 11:34:06 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2006-05-24 11:34:06 -0300 |
commit | 0079efc4796eca1321b8d7fd31d289eb1de48dff (patch) | |
tree | 5ed1f82adac26d5817d92a13269070c5f7703665 | |
parent | ad0765b4f01706c367e0e2f431c2043021b9361d (diff) | |
download | lua-github-0079efc4796eca1321b8d7fd31d289eb1de48dff.tar.gz |
bug: collector did not compensate enough for userdata with finalizers
-rw-r--r-- | lgc.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 2.36 2005/08/24 17:06:36 roberto Exp roberto $ +** $Id: lgc.c,v 2.37 2005/12/22 16:19:56 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -320,8 +320,10 @@ static l_mem propagatemark (global_State *g) { } -static void propagateall (global_State *g) { - while (g->gray) propagatemark(g); +static size_t propagateall (global_State *g) { + size_t m = 0; + while (g->gray) m += propagatemark(g); + return m; } @@ -540,7 +542,7 @@ static void atomic (lua_State *L) { propagateall(g); udsize = luaC_separateudata(L, 0); /* separate userdata to be finalized */ marktmu(g); /* mark `preserved' userdata */ - propagateall(g); /* remark, to propagate `preserveness' */ + udsize += propagateall(g); /* remark, to propagate `preserveness' */ cleartable(g->weak); /* remove collected objects from weak tables */ /* flip current white */ g->currentwhite = cast_byte(otherwhite(g)); @@ -590,6 +592,8 @@ static l_mem singlestep (lua_State *L) { case GCSfinalize: { if (g->tmudata) { GCTM(L); + if (g->estimate > GCFINALIZECOST) + g->estimate -= GCFINALIZECOST; return GCFINALIZECOST; } else { |