Author: Remi Meier <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit