Author: Remi Meier <[email protected]>
Branch: c8-card-marking
Changeset: r1684:17b08c18f7b4
Date: 2015-02-27 22:42 +0100
http://bitbucket.org/pypy/stmgc/changeset/17b08c18f7b4/

Log:    one more

diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -675,6 +675,12 @@
             /* whole obj */
             make_bk_slices_for_range(obj, (stm_char*)obj + start_offset,
                                      (stm_char*)obj + obj_size);
+            if (obj_should_use_cards(STM_SEGMENT->segment_base, obj)) {
+                /* mark whole obj as MARKED_OLD so we don't do bk slices 
anymore */
+                _reset_object_cards(get_priv_segment(STM_SEGMENT->segment_num),
+                                    obj, STM_SEGMENT->transaction_read_version,
+                                    true, false);
+            }
         } else {
             /* only fixed part */
             stmcb_get_card_base_itemsize(realobj, offset_itemsize);
@@ -944,6 +950,7 @@
             return;
     }
 
+    assert(obj_should_use_cards(STM_SEGMENT->segment_base, obj));
     dprintf_test(("write_slowpath_card %p -> index:%lu\n",
                   obj, index));
 
@@ -1266,8 +1273,9 @@
                undo->backup,
                SLICE_SIZE(undo->slice));
 
-        dprintf(("reset_modified_from_backup_copies(%d): obj=%p off=%lu 
bk=%p\n",
-                 segment_num, obj, SLICE_OFFSET(undo->slice), undo->backup));
+        dprintf(("reset_modified_from_backup_copies(%d): obj=%p off=%lu sz=%d 
bk=%p\n",
+                 segment_num, obj, SLICE_OFFSET(undo->slice),
+                 SLICE_SIZE(undo->slice), undo->backup));
 
         free_bk(undo);
     }
diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c
--- a/c8/stm/gcpage.c
+++ b/c8/stm/gcpage.c
@@ -488,7 +488,8 @@
                     REAL_ADDRESS(pseg->pub.segment_base, item);
                 OPT_ASSERT(realobj->stm_flags & GCFLAG_WRITE_BARRIER);
 
-                /* mark marked cards as old if it survives */
+                /* mark marked cards as old if it survives, otherwise
+                   CLEAR, as their spot could get reused */
                 uint8_t mark_value = mark_visited_test(item) ?
                     pseg->pub.transaction_read_version : CARD_CLEAR;
                 _reset_object_cards(pseg, item, mark_value, false,
diff --git a/c8/test/test_card_marking.py b/c8/test/test_card_marking.py
--- a/c8/test/test_card_marking.py
+++ b/c8/test/test_card_marking.py
@@ -351,7 +351,7 @@
         self.commit_transaction()
 
         self.start_transaction()
-        assert get_card_value(o, HDR-HDR) == CARD_CLEAR
+        assert get_card_value(o, HDR-HDR) < CARD_MARKED_OLD()
         stm_set_char(o, 'x', 1000, True)
 
         stm_set_char(o, 'u', HDR, False)
@@ -362,3 +362,15 @@
 
         self.start_transaction()
         assert stm_get_char(o, HDR) == 'v'
+
+    def test_card_marked_old3(self):
+        o = stm_allocate_old(1000+20*CARD_SIZE)
+
+        self.start_transaction()
+        stm_set_char(o, 'v', HDR, False)
+        stm_minor_collect()
+        stm_set_char(o, 'u', HDR, True)
+        self.abort_transaction()
+
+        self.start_transaction()
+        assert stm_get_char(o, HDR) == '\0'
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to