diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2006-05-24 11:33:49 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2006-05-24 11:33:49 -0300 |
commit | ad0765b4f01706c367e0e2f431c2043021b9361d (patch) | |
tree | 599e58b605c0bf16eba136e2a1bfbc5077f9d551 | |
parent | 20f4bbdc3a39446345e5f6433c7c71de60f8a0b7 (diff) | |
download | lua-github-ad0765b4f01706c367e0e2f431c2043021b9361d.tar.gz |
subtle problem with the garbage collector
-rw-r--r-- | bugs | 30 |
1 files changed, 29 insertions, 1 deletions
@@ -925,7 +925,7 @@ patch = [[ } -@Bug{ +Bug{ what = [[lua_dostring/lua_dofile should return any values returned by the chunk]], @@ -946,3 +946,31 @@ patch = [[ ]], } + + +Bug{ + +what = [[garbage collector does not compensate enough for finalizers]], + +patch = [[ +lgc.c: +@@ -322,4 +322,6 @@ + +-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; + } +@@ -542,3 +544,3 @@ + 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 */ +@@ -592,2 +594,4 @@ + GCTM(L); ++ if (g->estimate > GCFINALIZECOST) ++ g->estimate -= GCFINALIZECOST; +]] +} |