Author: Remi Meier <[email protected]>
Branch: stmgc-c7
Changeset: r73267:960172cff05f
Date: 2014-09-01 12:43 +0200
http://bitbucket.org/pypy/pypy/changeset/960172cff05f/

Log:    import stmgc

diff --git a/rpython/translator/stm/src_stm/revision 
b/rpython/translator/stm/src_stm/revision
--- a/rpython/translator/stm/src_stm/revision
+++ b/rpython/translator/stm/src_stm/revision
@@ -1,1 +1,1 @@
-dbe9b14b252f
+83e4c655d31b
diff --git a/rpython/translator/stm/src_stm/stm/core.c 
b/rpython/translator/stm/src_stm/stm/core.c
--- a/rpython/translator/stm/src_stm/stm/core.c
+++ b/rpython/translator/stm/src_stm/stm/core.c
@@ -232,8 +232,12 @@
 {
     struct object_s *realobj = (struct object_s *)
         REAL_ADDRESS(STM_SEGMENT->segment_base, obj);
+    long supports = stmcb_obj_supports_cards(realobj);
+    if (!supports)
+        return 0;
+
+    /* check also if it makes sense: */
     size_t size = stmcb_size_rounded_up(realobj);
-
     return (size >= _STM_MIN_CARD_OBJ_SIZE);
 }
 
@@ -591,13 +595,16 @@
     assert(!(obj->stm_flags & GCFLAG_CARDS_SET));
     assert(!IS_OVERFLOW_OBJ(STM_PSEGMENT, obj));
 
+    uintptr_t offset_itemsize[2];
     struct object_s *realobj = (struct object_s 
*)REAL_ADDRESS(STM_SEGMENT->segment_base, obj);
     size_t obj_size = stmcb_size_rounded_up(realobj);
     assert(obj_size >= 32);
+    stmcb_get_card_base_itemsize(realobj, offset_itemsize);
+    size_t real_idx_count = (obj_size - offset_itemsize[0]) / 
offset_itemsize[1];
 
     uintptr_t first_card_index = get_write_lock_idx((uintptr_t)obj);
     uintptr_t card_index = 1;
-    uintptr_t last_card_index = get_index_to_card_index(obj_size - 1); /* max 
valid index */
+    uintptr_t last_card_index = get_index_to_card_index(real_idx_count - 1); 
/* max valid index */
     long i, myself = STM_SEGMENT->segment_num;
 
     /* simple heuristic to check if probably the whole object is
@@ -618,7 +625,6 @@
     /* Combine multiple marked cards and do a memcpy for them. We don't
        try yet to use page_copy() or otherwise take into account privatization
        of pages (except _has_private_page_in_range) */
-    uintptr_t offset_itemsize[2];
     bool all_cards_were_cleared = true;
 
     uintptr_t start_card_index = -1;
@@ -635,7 +641,6 @@
                 /*     realobj, get_card_index_to_index(card_index)); */
                 if (all_cards_were_cleared) {
                     all_cards_were_cleared = false;
-                    stmcb_get_card_base_itemsize(realobj, offset_itemsize);
                 }
             }
         }
diff --git a/rpython/translator/stm/src_stm/stm/nursery.c 
b/rpython/translator/stm/src_stm/stm/nursery.c
--- a/rpython/translator/stm/src_stm/stm/nursery.c
+++ b/rpython/translator/stm/src_stm/stm/nursery.c
@@ -242,8 +242,12 @@
 #undef STM_SEGMENT
     struct object_s *realobj = (struct object_s 
*)REAL_ADDRESS(pseg->pub.segment_base, obj);
     size_t size = stmcb_size_rounded_up(realobj);
+    OPT_ASSERT(size >= _STM_MIN_CARD_OBJ_SIZE);
 
-    OPT_ASSERT(size >= _STM_MIN_CARD_OBJ_SIZE);
+    uintptr_t offset_itemsize[2];
+    stmcb_get_card_base_itemsize(realobj, offset_itemsize);
+    size = (size - offset_itemsize[0]) / offset_itemsize[1];
+
     assert(IMPLY(mark_value == CARD_CLEAR, !mark_all)); /* not necessary */
     assert(IMPLY(mark_all, mark_value == CARD_MARKED_OLD)); /* set *all* to 
OLD */
     assert(IMPLY(IS_OVERFLOW_OBJ(pseg, realobj),
diff --git a/rpython/translator/stm/src_stm/stmgc.h 
b/rpython/translator/stm/src_stm/stmgc.h
--- a/rpython/translator/stm/src_stm/stmgc.h
+++ b/rpython/translator/stm/src_stm/stmgc.h
@@ -260,6 +260,9 @@
    one item */
 extern void stmcb_get_card_base_itemsize(struct object_s *,
                                          uintptr_t offset_itemsize[2]);
+/* returns whether this object supports cards. we will only call
+   stmcb_get_card_base_itemsize on objs that do so. */
+extern long stmcb_obj_supports_cards(struct object_s *);
 extern void stmcb_commit_soon(void);
 
 
@@ -368,7 +371,7 @@
 int stm_is_inevitable(void);
 #else
 static inline int stm_is_inevitable(void) {
-    return !rewind_jmp_armed(&STM_SEGMENT->running_thread->rjthread); 
+    return !rewind_jmp_armed(&STM_SEGMENT->running_thread->rjthread);
 }
 #endif
 static inline void stm_become_inevitable(stm_thread_local_t *tl,
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to