[pypy-commit] stmgc c8-card-marking: even more fixes

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


Author: Remi Meier <remi.meier at gmail.com>
Branch: c8-card-marking
Changeset: r1683:b551018deaf1
Date: 2015-02-27 22:15 +0100
http://bitbucket.org/pypy/stmgc/changeset/b551018deaf1/

Log:	even more fixes

diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -701,10 +701,12 @@
         }
 
         card_index = get_index_to_card_index(index);
+
         size_t card_offset = offset_itemsize[0]
             + get_card_index_to_index(card_index) * offset_itemsize[1];
         size_t after_card_offset = offset_itemsize[0]
             + get_card_index_to_index(card_index + 1) * offset_itemsize[1];
+
         if (after_card_offset > obj_size)
             after_card_offset = obj_size;
 
@@ -733,10 +735,11 @@
             /* "CARD_MARKED_OLD" or CARD_MARKED */
             OPT_ASSERT(card_value == STM_SEGMENT->transaction_read_version
                        || card_value == CARD_MARKED);
-            /* we don't need CARD_MARKED anymore after executing this function,
-               but we may still need to avoid creating bk copies in the future: */
-            cards[card_index].rm = STM_SEGMENT->transaction_read_version;
         }
+        /* in any case, remember that we already made a bk slice for this
+           card, so set to "MARKED_OLD": */
+        cards[card_index].rm = STM_SEGMENT->transaction_read_version;
+
 
         if (start_card_index != -1                    /* something to copy */
             && (card_value == CARD_MARKED             /* found marked card */
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
@@ -229,44 +229,44 @@
         o = stm_allocate_old(1000+20*CARD_SIZE)
 
         self.start_transaction()
-        assert get_card_value(o, 1000) == CARD_CLEAR
+        assert get_card_value(o, 1000-HDR) == CARD_CLEAR
         stm_set_char(o, 'a', 1000, True)
-        assert get_card_value(o, 1000) == CARD_MARKED
+        assert get_card_value(o, 1000-HDR) == CARD_MARKED
         assert o in old_objects_with_cards_set()
 
         stm_minor_collect()
-        assert get_card_value(o, 1000) == CARD_MARKED_OLD()
+        assert get_card_value(o, 1000-HDR) == CARD_MARKED_OLD()
         self.commit_transaction()
 
         self.start_transaction()
-        assert get_card_value(o, 1000) not in (CARD_CLEAR, CARD_MARKED_OLD())
+        assert get_card_value(o, 1000-HDR) not in (CARD_CLEAR, CARD_MARKED_OLD())
         stm_set_char(o, 'b', 1000, True)
-        assert get_card_value(o, 1000) == CARD_MARKED
+        assert get_card_value(o, 1000-HDR) == CARD_MARKED
         assert o in old_objects_with_cards_set()
         self.commit_transaction()
 
     def test_clear_cards2(self):
         self.start_transaction()
         o = stm_allocate(1000+20*CARD_SIZE)
-        assert get_card_value(o, 1000) == CARD_CLEAR
+        assert get_card_value(o, 1000-HDR) == CARD_CLEAR
         stm_set_char(o, 'a', 1000, True)
-        assert get_card_value(o, 1000) == CARD_CLEAR
+        assert get_card_value(o, 1000-HDR) == CARD_CLEAR
         assert o not in old_objects_with_cards_set()
 
         self.push_root(o)
         stm_minor_collect()
         o = self.pop_root()
 
-        assert get_card_value(o, 1000) == CARD_CLEAR
+        assert get_card_value(o, 1000-HDR) == CARD_CLEAR
         stm_set_char(o, 'b', 1000, True)
-        assert get_card_value(o, 1000) == CARD_MARKED
+        assert get_card_value(o, 1000-HDR) == CARD_MARKED
         assert o in old_objects_with_cards_set()
         self.commit_transaction()
 
         self.start_transaction()
-        assert get_card_value(o, 1000) not in (CARD_CLEAR, CARD_MARKED_OLD())
+        assert get_card_value(o, 1000-HDR) not in (CARD_CLEAR, CARD_MARKED_OLD())
         stm_set_char(o, 'b', 1000, True)
-        assert get_card_value(o, 1000) == CARD_MARKED
+        assert get_card_value(o, 1000-HDR) == CARD_MARKED
         assert o in old_objects_with_cards_set()
         self.commit_transaction()
 
@@ -278,13 +278,13 @@
         stm_minor_collect()
         o = self.pop_root()
 
-        assert get_card_value(o, 1000) == CARD_CLEAR
+        assert get_card_value(o, 1000-HDR) == CARD_CLEAR
         stm_set_char(o, 'b', 1000, True)
-        assert get_card_value(o, 1000) == CARD_MARKED
+        assert get_card_value(o, 1000-HDR) == CARD_MARKED
         assert o in old_objects_with_cards_set()
 
         stm_major_collect()
-        assert get_card_value(o, 1000) == CARD_CLEAR
+        assert get_card_value(o, 1000-HDR) == CARD_CLEAR
         assert o not in old_objects_with_cards_set()
 
         self.commit_transaction()
@@ -293,8 +293,8 @@
         self.start_transaction()
         o = stm_allocate(1000+20*CARD_SIZE)
         p = stm_allocate(1000+20*CARD_SIZE)
-        assert get_card_value(o, 1000) == CARD_CLEAR
-        assert get_card_value(p, 1000) == CARD_CLEAR
+        assert get_card_value(o, 1000-HDR) == CARD_CLEAR
+        assert get_card_value(p, 1000-HDR) == CARD_CLEAR
 
         self.push_root(o)
         self.push_root(p)
@@ -302,20 +302,20 @@
         p = self.pop_root()
         o = self.pop_root()
 
-        assert get_card_value(o, 1000) == CARD_CLEAR
-        assert get_card_value(p, 1000) == CARD_CLEAR
+        assert get_card_value(o, 1000-HDR) == CARD_CLEAR
+        assert get_card_value(p, 1000-HDR) == CARD_CLEAR
         stm_set_char(o, 'b', 1000, True)
         stm_set_char(p, 'b', 1000, True)
-        assert get_card_value(o, 1000) == CARD_MARKED
-        assert get_card_value(p, 1000) == CARD_MARKED
+        assert get_card_value(o, 1000-HDR) == CARD_MARKED
+        assert get_card_value(p, 1000-HDR) == CARD_MARKED
 
         self.push_root(o)
         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
+        assert get_card_value(o, 1000-HDR) == CARD_MARKED_OLD()
+        assert get_card_value(p, 1000-HDR) == CARD_CLEAR
 
         self.push_root(o)
         self.commit_transaction()
@@ -323,10 +323,10 @@
         self.start_transaction()
         o = self.pop_root()
 
-        assert get_card_value(o, 1000) != CARD_CLEAR
-        assert get_card_value(o, 1000) < CARD_MARKED_OLD()
+        assert get_card_value(o, 1000-HDR) != CARD_CLEAR
+        assert get_card_value(o, 1000-HDR) < CARD_MARKED_OLD()
         stm_set_char(o, 'b', 1000, True)
-        assert get_card_value(o, 1000) == CARD_MARKED
+        assert get_card_value(o, 1000-HDR) == CARD_MARKED
 
         self.commit_transaction()
 
@@ -341,3 +341,24 @@
 
         self.start_transaction()
         assert stm_get_char(o, HDR) == '\0'
+
+
+    def test_card_marked_old2(self):
+        o = stm_allocate_old(1000+20*CARD_SIZE)
+
+        self.start_transaction()
+        stm_set_char(o, 'v', HDR, False)
+        self.commit_transaction()
+
+        self.start_transaction()
+        assert get_card_value(o, HDR-HDR) == CARD_CLEAR
+        stm_set_char(o, 'x', 1000, True)
+
+        stm_set_char(o, 'u', HDR, False)
+
+        stm_minor_collect()
+        stm_set_char(o, 'y', HDR, True)
+        self.abort_transaction()
+
+        self.start_transaction()
+        assert stm_get_char(o, HDR) == 'v'


More information about the pypy-commit mailing list