Author: Remi Meier <remi.me...@inf.ethz.ch>
Branch: card-marking
Changeset: r1217:73abd268f72c
Date: 2014-05-20 10:07 +0200
http://bitbucket.org/pypy/stmgc/changeset/73abd268f72c/

Log:    fix and add failing test

diff --git a/c7/stm/nursery.c b/c7/stm/nursery.c
--- a/c7/stm/nursery.c
+++ b/c7/stm/nursery.c
@@ -186,23 +186,24 @@
 static void minor_trace_if_young_cards(object_t **pobj)
 {
     /* XXX: maybe add a specialised stmcb_trace_cards() */
-    object_t *obj = *pobj;
-    if (write_locks[get_write_lock_idx((uintptr_t)obj)])
+    uintptr_t obj = (uintptr_t)((char*)pobj - STM_SEGMENT->segment_base);
+    if (write_locks[get_write_lock_idx(obj)]) {
+        dprintf(("minor_trace_if_young_cards: trace %p\n", *pobj));
         minor_trace_if_young(pobj);
+    }
 }
 
 static inline void _collect_now(object_t *obj)
 {
     assert(!_is_young(obj));
 
-    /* If WRITE_BARRIER: CARDS_SET */
-    /* If not WRITE_BARRIER: maybe CARDS_SET */
+    dprintf(("_collect_now: %p\n", obj));
     assert(IMPLY(obj->stm_flags & GCFLAG_WRITE_BARRIER,
                  obj->stm_flags & GCFLAG_CARDS_SET));
     if (!(obj->stm_flags & GCFLAG_WRITE_BARRIER)) {
         /* do normal full trace, even if also card-marked */
         obj->stm_flags |= GCFLAG_WRITE_BARRIER;
-
+        dprintf(("-> has no cards\n"));
         /* Trace the 'obj' to replace pointers to nursery with pointers
            outside the nursery, possibly forcing nursery objects out and
            adding them to 'objects_pointing_to_nursery' as well. */
@@ -210,6 +211,8 @@
         stmcb_trace((struct object_s *)realobj, &minor_trace_if_young);
     } else {
         /* only trace cards */
+        dprintf(("-> has cards\n"));
+        assert(!_is_in_nursery(obj));
         char *realobj = REAL_ADDRESS(STM_SEGMENT->segment_base, obj);
         stmcb_trace((struct object_s *)realobj, &minor_trace_if_young_cards);
     }
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -79,6 +79,7 @@
 uint32_t _get_type_id(object_t *obj);
 void _set_ptr(object_t *obj, int n, object_t *v);
 object_t * _get_ptr(object_t *obj, int n);
+uintptr_t _index_to_offset(object_t *obj, int n);
 
 void _set_weakref(object_t *obj, object_t *v);
 object_t* _get_weakref(object_t *obj);
@@ -267,6 +268,16 @@
     return *field;
 }
 
+uintptr_t _index_to_offset(object_t *obj, int n)
+{
+    long nrefs = (long)((myobj_t*)obj)->type_id - 421420;
+    assert(n < nrefs);
+
+    stm_char *field_addr = NULL;
+    field_addr += SIZEOF_MYOBJ; /* header */
+    field_addr += n * sizeof(void*); /* field */
+    return (uintptr_t)field_addr;
+}
 
 ssize_t stmcb_size_rounded_up(struct object_s *obj)
 {
@@ -395,22 +406,34 @@
     lib._set_type_id(o, tid)
     return o
 
-def stm_set_ref(obj, idx, ref):
-    stm_write(obj)
+def stm_set_ref(obj, idx, ref, use_cards=False):
+    if use_cards:
+        stm_write_card(obj, lib._index_to_offset(obj, idx))
+    else:
+        stm_write(obj)
     lib._set_ptr(obj, idx, ref)
 
-def stm_get_ref(obj, idx):
-    stm_read(obj)
+def stm_get_ref(obj, idx, use_cards=False):
+    if use_cards:
+        stm_read_card(obj, lib._index_to_offset(obj, idx))
+    else:
+        stm_read(obj)
     return lib._get_ptr(obj, idx)
 
-def stm_set_char(obj, c, offset=HDR):
-    stm_write(obj)
+def stm_set_char(obj, c, offset=HDR, use_cards=False):
     assert HDR <= offset < stm_get_obj_size(obj)
+    if use_cards:
+        stm_write_card(obj, offset)
+    else:
+        stm_write(obj)
     stm_get_real_address(obj)[offset] = c
 
-def stm_get_char(obj, offset=HDR):
-    stm_read(obj)
+def stm_get_char(obj, offset=HDR, use_cards=False):
     assert HDR <= offset < stm_get_obj_size(obj)
+    if use_cards:
+        stm_read_card(obj, offset)
+    else:
+        stm_read(obj)
     return stm_get_real_address(obj)[offset]
 
 def stm_get_real_address(obj):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to