Author: Armin Rigo <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit