summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2006-05-24 11:33:49 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2006-05-24 11:33:49 -0300
commitad0765b4f01706c367e0e2f431c2043021b9361d (patch)
tree599e58b605c0bf16eba136e2a1bfbc5077f9d551
parent20f4bbdc3a39446345e5f6433c7c71de60f8a0b7 (diff)
downloadlua-github-ad0765b4f01706c367e0e2f431c2043021b9361d.tar.gz
subtle problem with the garbage collector
-rw-r--r--bugs30
1 files changed, 29 insertions, 1 deletions
diff --git a/bugs b/bugs
index a65f5474..878117b1 100644
--- 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;
+]]
+}