[pypy-commit] stmgc c8-card-marking: basic card-marking seems to work

Raemi noreply at buildbot.pypy.org
Thu Feb 26 21:46:50 CET 2015


Author: Remi Meier <remi.meier at gmail.com>
Branch: c8-card-marking
Changeset: r1673:a7b28578ad96
Date: 2015-02-26 21:47 +0100
http://bitbucket.org/pypy/stmgc/changeset/a7b28578ad96/

Log:	basic card-marking seems to work

diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -581,7 +581,7 @@
 }
 
 
-static bool obj_should_use_cards(char *seg_base, object_t *obj)
+bool obj_should_use_cards(char *seg_base, object_t *obj)
 {
     if (is_small_uniform(obj))
         return false;
diff --git a/c8/stm/core.h b/c8/stm/core.h
--- a/c8/stm/core.h
+++ b/c8/stm/core.h
@@ -237,6 +237,7 @@
     return (addr - stm_object_pages) / (NB_PAGES * 4096UL);
 }
 
+bool obj_should_use_cards(char *seg_base, object_t *obj);
 
 static bool _is_tl_registered(stm_thread_local_t *tl);
 static bool _seems_to_be_running_transaction(void);
diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c
--- a/c8/stm/gcpage.c
+++ b/c8/stm/gcpage.c
@@ -501,11 +501,6 @@
                     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 {
@@ -519,11 +514,11 @@
             ({
                 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;
+                /* mark marked cards as old if it survives */
+                uint8_t mark_value = mark_visited_test(item) ?
+                    CARD_MARKED_OLD : CARD_CLEAR;
                 _reset_object_cards(pseg, item, mark_value, false);
             }));
         list_clear(lst);
@@ -535,6 +530,8 @@
         while (n-- > 0) {
             object_t *obj = (object_t *)list_item(lst, n);
             if (!mark_visited_test(obj)) {
+                if (obj_should_use_cards(pseg->pub.segment_base, obj))
+                    _reset_object_cards(pseg, obj, CARD_CLEAR, false);
                 list_set_item(lst, n, list_pop_item(lst));
             }
         }
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
@@ -244,3 +244,47 @@
         assert get_card_value(o, 1000) == 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
+        stm_set_char(o, 'a', 1000, True)
+        assert get_card_value(o, 1000) == 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
+        stm_set_char(o, 'b', 1000, True)
+        assert get_card_value(o, 1000) == CARD_MARKED
+        assert o in old_objects_with_cards_set()
+        self.commit_transaction()
+
+        self.start_transaction()
+        assert get_card_value(o, 1000) == CARD_CLEAR
+        stm_set_char(o, 'b', 1000, True)
+        assert get_card_value(o, 1000) == CARD_MARKED
+        assert o in old_objects_with_cards_set()
+        self.commit_transaction()
+
+    def test_clear_cards3(self):
+        self.start_transaction()
+        o = stm_allocate(1000+20*CARD_SIZE)
+
+        self.push_root(o)
+        stm_minor_collect()
+        o = self.pop_root()
+
+        assert get_card_value(o, 1000) == CARD_CLEAR
+        stm_set_char(o, 'b', 1000, True)
+        assert get_card_value(o, 1000) == CARD_MARKED
+        assert o in old_objects_with_cards_set()
+
+        stm_major_collect()
+        assert get_card_value(o, 1000) == CARD_CLEAR
+        assert o not in old_objects_with_cards_set()
+
+        self.commit_transaction()


More information about the pypy-commit mailing list