Author: Remi Meier <[email protected]>
Branch: c8-card-marking
Changeset: r1671:aaa47dab157c
Date: 2015-02-26 20:35 +0100
http://bitbucket.org/pypy/stmgc/changeset/aaa47dab157c/

Log:    progress

diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -985,7 +985,7 @@
         ({
             assert(item->stm_flags & GCFLAG_WB_EXECUTED);
             _cards_cleared_in_object(pseg, item); /* check for C8 */
-            _reset_object_cards(pseg, item, CARD_CLEAR, false); /* 
unnecessary, as sync_obj_enq does it already? */
+
             item->stm_flags &= ~GCFLAG_WB_EXECUTED;
             synchronize_object_enqueue(item, true);
         }));
diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c
--- a/c8/stm/gcpage.c
+++ b/c8/stm/gcpage.c
@@ -499,6 +499,13 @@
                     assert(!(realobj->stm_flags & GCFLAG_WRITE_BARRIER));
 
                     realobj->stm_flags |= GCFLAG_WRITE_BARRIER;
+
+                    OPT_ASSERT(!(realobj->stm_flags & GCFLAG_CARDS_SET));
+                    if (realobj->stm_flags & GCFLAG_CARDS_SET) {
+                        /* we called a normal WB on this object, so all cards
+                           need to be marked OLD */
+                        _reset_object_cards(pseg, item, CARD_MARKED_OLD, 
true); /* mark all */
+                    }
                 }));
             list_clear(lst);
         } else {
@@ -507,6 +514,21 @@
                modified_old_objs. */
         }
 
+        lst = pseg->old_objects_with_cards_set;
+        LIST_FOREACH_R(lst, object_t* /*item*/,
+            ({
+                struct object_s *realobj = (struct object_s *)
+                    REAL_ADDRESS(pseg->pub.segment_base, item);
+                OPT_ASSERT(realobj->stm_flags & GCFLAG_CARDS_SET);
+                OPT_ASSERT(realobj->stm_flags & GCFLAG_WRITE_BARRIER);
+
+                /* mark marked cards as old otherwise */
+                uint8_t mark_value = CARD_MARKED_OLD;
+                _reset_object_cards(pseg, item, mark_value, false);
+            }));
+        list_clear(lst);
+
+
         /* remove from new_objects all objects that die */
         lst = pseg->new_objects;
         uintptr_t n = list_count(lst);
diff --git a/c8/stm/nursery.c b/c8/stm/nursery.c
--- a/c8/stm/nursery.c
+++ b/c8/stm/nursery.c
@@ -207,9 +207,6 @@
 
     assert(IMPLY(mark_value == CARD_CLEAR, !mark_all)); /* not necessary */
     assert(IMPLY(mark_all, mark_value == CARD_MARKED_OLD)); /* set *all* to 
OLD */
-    assert(IMPLY(realobj->stm_flags & GCFLAG_WB_EXECUTED,
-                 mark_value == CARD_CLEAR)); /* overflows are always CLEARed */
-
 
     struct stm_read_marker_s *cards = get_read_marker(pseg->pub.segment_base, 
(uintptr_t)obj);
     uintptr_t card_index = 1;
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to