Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r335:bf56c12295c8
Date: 2013-07-01 15:07 +0200
http://bitbucket.org/pypy/stmgc/changeset/bf56c12295c8/

Log:    Fix: we must explicitly keep the property that L->h_revision==R that
        some pairs in public_to_private have got.

diff --git a/c4/gcpage.c b/c4/gcpage.c
--- a/c4/gcpage.c
+++ b/c4/gcpage.c
@@ -373,9 +373,20 @@
         G2L_LOOP_FORWARD(d->public_to_private, item) {
             /* note that 'item->addr' is also in the read set, so if it was
                outdated, it will be found at that time */
-            visit_keep(item->addr);
-            if (item->val != NULL)
-                visit_keep(item->val);
+            gcptr R = item->addr;
+            gcptr L = item->val;
+            visit_keep(R);
+            if (L != NULL) {
+                revision_t v = L->h_revision;
+                visit_keep(L);
+                /* a bit of custom logic here: if L->h_revision used to
+                   point exactly to R, as set by stealing, then we must
+                   keep this property, even though visit_keep(L) might
+                   decide it would be better to make it point to a more
+                   recent copy. */
+                if (v == (revision_t)R)
+                    L->h_revision = v;   /* restore */
+            }
         } G2L_LOOP_END;
 
         /* make sure that the other lists are empty */
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to