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