Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r476:50d9d16d6327 Date: 2013-08-15 11:26 +0200 http://bitbucket.org/pypy/stmgc/changeset/50d9d16d6327/
Log: Forgot that d->abortinfo also contains gc ptrs diff --git a/c4/gcpage.c b/c4/gcpage.c --- a/c4/gcpage.c +++ b/c4/gcpage.c @@ -496,6 +496,14 @@ visit_take_protected(d->thread_local_obj_ref); visit_take_protected(&d->old_thread_local_obj); + /* the abortinfo objects */ + long i, size = d->abortinfo.size; + gcptr *items = d->abortinfo.items; + for (i = 0; i < size; i += 2) { + visit_take_protected(&items[i]); + /* items[i+1] is not a gc ptr */ + } + /* the current transaction's private copies of public objects */ wlog_t *item; G2L_LOOP_FORWARD(d->public_to_private, item) { @@ -527,8 +535,8 @@ } G2L_LOOP_END; /* reinsert to real pub_to_priv */ - long i, size = new_public_to_private.size; - gcptr *items = new_public_to_private.items; + size = new_public_to_private.size; + items = new_public_to_private.items; for (i = 0; i < size; i += 2) { g2l_insert(&d->public_to_private, items[i], items[i + 1]); } diff --git a/c4/nursery.c b/c4/nursery.c --- a/c4/nursery.c +++ b/c4/nursery.c @@ -436,6 +436,19 @@ spinlock_release(d->public_descriptor->collection_lock); } +static void mark_extra_stuff(struct tx_descriptor *d) +{ + visit_if_young(d->thread_local_obj_ref); + visit_if_young(&d->old_thread_local_obj); + + long i, size = d->abortinfo.size; + gcptr *items = d->abortinfo.items; + for (i = 0; i < size; i += 2) { + visit_if_young(&items[i]); + /* items[i+1] is not a gc ptr */ + } +} + static void minor_collect(struct tx_descriptor *d) { dprintf(("minor collection [%p to %p]\n", @@ -451,8 +464,7 @@ mark_young_roots(d); - visit_if_young(d->thread_local_obj_ref); - visit_if_young(&d->old_thread_local_obj); + mark_extra_stuff(d); mark_stolen_young_stubs(d); _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit