commit ad0765b4f01706c367e0e2f431c2043021b9361d
parent 20f4bbdc3a39446345e5f6433c7c71de60f8a0b7
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Wed, 24 May 2006 11:33:26 -0300
subtle problem with the garbage collector
Diffstat:
M | bugs | | | 30 | +++++++++++++++++++++++++++++- |
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/bugs b/bugs
@@ -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;
+]]
+}