[pypy-commit] stmgc default: introduce stmcb_obj_supports_cards and hopefully make cards finally work as they should

Raemi noreply at buildbot.pypy.org
Mon Sep 1 11:45:11 CEST 2014


Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch: 
Changeset: r1326:83e4c655d31b
Date: 2014-09-01 11:46 +0200
http://bitbucket.org/pypy/stmgc/changeset/83e4c655d31b/

Log:	introduce stmcb_obj_supports_cards and hopefully make cards finally
	work as they should

diff --git a/c7/demo/demo2.c b/c7/demo/demo2.c
--- a/c7/demo/demo2.c
+++ b/c7/demo/demo2.c
@@ -43,6 +43,10 @@
     n = (struct node_s*)obj;
     visit((object_t **)&n->next);
 }
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+    return 0;
+}
 void stmcb_get_card_base_itemsize(struct object_s *obj,
                                   uintptr_t offset_itemsize[2])
 {
diff --git a/c7/demo/demo_largemalloc.c b/c7/demo/demo_largemalloc.c
--- a/c7/demo/demo_largemalloc.c
+++ b/c7/demo/demo_largemalloc.c
@@ -24,7 +24,10 @@
 }
 
 void stmcb_commit_soon() {}
-
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+    return 0;
+}
 void stmcb_trace_cards(struct object_s *obj, void cb(object_t **),
                        uintptr_t start, uintptr_t stop) {
     abort();
diff --git a/c7/demo/demo_random.c b/c7/demo/demo_random.c
--- a/c7/demo/demo_random.c
+++ b/c7/demo/demo_random.c
@@ -80,7 +80,10 @@
 }
 
 void stmcb_commit_soon() {}
-
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+    return 0;
+}
 void stmcb_trace_cards(struct object_s *obj, void cb(object_t **),
                        uintptr_t start, uintptr_t stop) {
     abort();
diff --git a/c7/demo/demo_random2.c b/c7/demo/demo_random2.c
--- a/c7/demo/demo_random2.c
+++ b/c7/demo/demo_random2.c
@@ -85,6 +85,10 @@
 
 void stmcb_commit_soon() {}
 
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+    return 0;
+}
 void stmcb_trace_cards(struct object_s *obj, void cb(object_t **),
                        uintptr_t start, uintptr_t stop) {
     abort();
diff --git a/c7/demo/demo_simple.c b/c7/demo/demo_simple.c
--- a/c7/demo/demo_simple.c
+++ b/c7/demo/demo_simple.c
@@ -38,7 +38,10 @@
     n = (struct node_s*)obj;
     visit((object_t **)&n->next);
 }
-
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+    return 0;
+}
 void stmcb_commit_soon() {}
 
 void stmcb_trace_cards(struct object_s *obj, void cb(object_t **),
diff --git a/c7/demo/test_shadowstack.c b/c7/demo/test_shadowstack.c
--- a/c7/demo/test_shadowstack.c
+++ b/c7/demo/test_shadowstack.c
@@ -18,6 +18,10 @@
 void stmcb_trace(struct object_s *obj, void visit(object_t **))
 {
 }
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+    return 0;
+}
 void stmcb_get_card_base_itemsize(struct object_s *obj,
                                   uintptr_t offset_itemsize[2])
 {
diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -231,8 +231,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);
 }
 
@@ -590,13 +594,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
@@ -617,7 +624,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;
@@ -634,7 +640,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/c7/stm/nursery.c b/c7/stm/nursery.c
--- a/c7/stm/nursery.c
+++ b/c7/stm/nursery.c
@@ -241,8 +241,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/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -259,6 +259,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);
 
 
@@ -367,7 +370,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,
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -301,7 +301,10 @@
         visit(ref);
     }
 }
-
+long stmcb_obj_supports_cards(struct object_s *obj)
+{
+    return 1;
+}
 void stmcb_trace_cards(struct object_s *obj, void visit(object_t **),
                        uintptr_t start, uintptr_t stop)
 {


More information about the pypy-commit mailing list