[pypy-commit] stmgc c8-card-marking: fix

Raemi noreply at buildbot.pypy.org
Fri Feb 27 22:44:06 CET 2015


Author: Remi Meier <remi.meier at gmail.com>
Branch: c8-card-marking
Changeset: r1680:3a1d24bc19e8
Date: 2015-02-27 17:59 +0100
http://bitbucket.org/pypy/stmgc/changeset/3a1d24bc19e8/

Log:	fix

diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -600,12 +600,12 @@
     dprintf(("make_bk_slices_for_range(%p, %lu, %lu)\n",
              obj, start - (stm_char*)obj, end - start));
     char *realobj = REAL_ADDRESS(STM_SEGMENT->segment_base, obj);
-    size_t obj_size = stmcb_size_rounded_up((struct object_s*)realobj);
     uintptr_t first_page = ((uintptr_t)start) / 4096UL;
     uintptr_t end_page = ((uintptr_t)end) / 4096UL;
 
     uintptr_t page;
     uintptr_t slice_sz;
+    uintptr_t slice_off = start - (stm_char*)obj;
     uintptr_t in_page_offset = (uintptr_t)start % 4096UL;
     uintptr_t remaining_obj_sz = end - start;
     for (page = first_page; page <= end_page; page++) {
@@ -617,7 +617,6 @@
             slice_sz = 4096UL - in_page_offset;
         }
 
-        size_t slice_off = obj_size - remaining_obj_sz;
         remaining_obj_sz -= slice_sz;
         in_page_offset = (in_page_offset + slice_sz) % 4096UL; /* mostly 0 */
 
@@ -633,7 +632,10 @@
             (uintptr_t)obj,     /* obj */
             (uintptr_t)bk_slice,  /* bk_addr */
             NEW_SLICE(slice_off, slice_sz));
+        dprintf(("> append slice %p, off=%lu, sz=%lu\n", bk_slice, slice_off, slice_sz));
         release_modification_lock(STM_SEGMENT->segment_num);
+
+        slice_off += slice_sz;
     }
 
 }
@@ -775,6 +777,7 @@
         card_index++;
     }
 
+    obj->stm_flags &= ~GCFLAG_CARDS_SET;
     _cards_cleared_in_object(get_priv_segment(STM_SEGMENT->segment_num), obj);
 }
 
@@ -783,7 +786,7 @@
 {
     assert(obj->stm_flags & GCFLAG_WRITE_BARRIER);
     assert(!(obj->stm_flags & GCFLAG_WB_EXECUTED));
-    dprintf(("write_slowpath-fast(%p)\n", obj));
+    dprintf(("write_slowpath_overflow_obj(%p)\n", obj));
 
     if (!mark_card) {
         /* The basic case, with no card marking.  We append the object
@@ -833,10 +836,12 @@
     DEBUG_EXPECT_SEGFAULT(false);
 
     if (mark_card) {
-        make_bk_slices(obj,
-                       true,        /* first_call */
-                       -2,          /* index: backup only fixed part */
-                       false);      /* do_missing_cards */
+        if (!(obj->stm_flags & GCFLAG_WB_EXECUTED)) {
+            make_bk_slices(obj,
+                           true,        /* first_call */
+                           -2,          /* index: backup only fixed part */
+                           false);      /* do_missing_cards */
+        }
 
         /* don't remove WRITE_BARRIER, but add CARDS_SET */
         obj->stm_flags |= (GCFLAG_CARDS_SET | GCFLAG_WB_EXECUTED);
@@ -936,8 +941,9 @@
     struct stm_read_marker_s *cards = get_read_marker(STM_SEGMENT->segment_base,
                                                       (uintptr_t)obj);
     uintptr_t card_index = get_index_to_card_index(index);
-    if (!(cards[card_index].rm == CARD_MARKED
-          || cards[card_index].rm == STM_SEGMENT->transaction_read_version)) {
+    if (!IS_OVERFLOW_OBJ(STM_PSEGMENT, obj)
+        && !(cards[card_index].rm == CARD_MARKED
+             || cards[card_index].rm == STM_SEGMENT->transaction_read_version)) {
         /* need to do the backup slice of the card */
         make_bk_slices(obj,
                        false,       /* first_call */
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
@@ -239,7 +239,7 @@
         self.commit_transaction()
 
         self.start_transaction()
-        assert get_card_value(o, 1000) == CARD_CLEAR
+        assert get_card_value(o, 1000) not in (CARD_CLEAR, CARD_MARKED_OLD())
         stm_set_char(o, 'b', 1000, True)
         assert get_card_value(o, 1000) == CARD_MARKED
         assert o in old_objects_with_cards_set()
@@ -264,7 +264,7 @@
         self.commit_transaction()
 
         self.start_transaction()
-        assert get_card_value(o, 1000) == CARD_CLEAR
+        assert get_card_value(o, 1000) not in (CARD_CLEAR, CARD_MARKED_OLD())
         stm_set_char(o, 'b', 1000, True)
         assert get_card_value(o, 1000) == CARD_MARKED
         assert o in old_objects_with_cards_set()
@@ -310,8 +310,9 @@
         assert get_card_value(p, 1000) == CARD_MARKED
 
         self.push_root(o)
-        stm_minor_collect()
+        stm_major_collect()
         o = self.pop_root()
+        # p dies and gets cards CLEARed
 
         assert get_card_value(o, 1000) == CARD_MARKED_OLD()
         assert get_card_value(p, 1000) == CARD_CLEAR


More information about the pypy-commit mailing list