[pypy-commit] stmgc card-marking: Call stmcb_get_card_base_itemsize() lazily only if needed

arigo noreply at buildbot.pypy.org
Mon Jun 30 12:23:50 CEST 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: card-marking
Changeset: r1261:9c17fefa1cc0
Date: 2014-06-30 12:14 +0200
http://bitbucket.org/pypy/stmgc/changeset/9c17fefa1cc0/

Log:	Call stmcb_get_card_base_itemsize() lazily only if needed

diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -587,25 +587,29 @@
     uintptr_t base_offset;
     ssize_t item_size;
     bool all_cards_were_cleared = true;
-    stmcb_get_card_base_itemsize(realobj, &base_offset, &item_size);
 
     uintptr_t start_card_index = -1;
     while (card_index <= last_card_index) {
         uintptr_t card_lock_idx = first_card_index + card_index;
         uint8_t card_value = write_locks[card_lock_idx];
 
-        OPT_ASSERT(card_value != CARD_MARKED); /* always only MARKED_OLD or CLEAR */
-
         if (card_value == CARD_MARKED_OLD) {
-            all_cards_were_cleared = false;
             write_locks[card_lock_idx] = CARD_CLEAR;
 
             if (start_card_index == -1) {   /* first marked card */
                 start_card_index = card_index;
                 /* start = (uintptr_t)obj + stmcb_index_to_byte_offset( */
                 /*     realobj, get_card_index_to_index(card_index)); */
+                if (all_cards_were_cleared) {
+                    all_cards_were_cleared = false;
+                    stmcb_get_card_base_itemsize(realobj, &base_offset,
+                                                 &item_size);
+                }
             }
         }
+        else {
+            OPT_ASSERT(card_value == CARD_CLEAR);
+        }
 
         if (start_card_index != -1                    /* something to copy */
             && (card_value != CARD_MARKED_OLD         /* found non-marked card */


More information about the pypy-commit mailing list