Jelajahi Sumber

subtle problem with the garbage collector

Roberto Ierusalimschy 19 tahun lalu
induk
melakukan
ad0765b4f0
1 mengubah file dengan 29 tambahan dan 1 penghapusan
  1. 29 1
      bugs

+ 29 - 1
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;
+]]
+}