Author: Armin Rigo <[email protected]>
Branch:
Changeset: r149:921a07e0b869
Date: 2013-06-16 16:19 +0200
http://bitbucket.org/pypy/stmgc/changeset/921a07e0b869/
Log: Copy this logic from c3.
diff --git a/c4/et.c b/c4/et.c
--- a/c4/et.c
+++ b/c4/et.c
@@ -790,6 +790,7 @@
assert(d->list_of_read_objects.size == 0);
assert(d->private_from_protected.size == 0);
assert(d->num_private_from_protected_known_old == 0);
+ assert(d->num_read_objects_known_old == 0);
assert(!g2l_any_entry(&d->public_to_private));
assert(d->public_descriptor->stolen_objects.size == 0);
@@ -1008,6 +1009,7 @@
};
gcptrlist_clear(&d->private_from_protected);
d->num_private_from_protected_known_old = 0;
+ d->num_read_objects_known_old = 0;
fprintf(stderr, "private_from_protected: clear (commit)\n");
}
@@ -1053,6 +1055,7 @@
};
gcptrlist_clear(&d->private_from_protected);
d->num_private_from_protected_known_old = 0;
+ d->num_read_objects_known_old = 0;
fprintf(stderr, "private_from_protected: clear (abort)\n");
}
diff --git a/c4/nursery.c b/c4/nursery.c
--- a/c4/nursery.c
+++ b/c4/nursery.c
@@ -269,6 +269,31 @@
}
}
+static void fix_list_of_read_objects(struct tx_descriptor *d)
+{
+ long i, limit = d->num_read_objects_known_old;
+ gcptr *items = d->list_of_read_objects.items;
+ assert(d->list_of_read_objects.size >= limit);
+
+ for (i = d->list_of_read_objects.size - 1; i >= limit; --i) {
+ gcptr obj = items[i];
+
+ if (!is_in_nursery(d, obj)) {
+ /* non-young or visited young objects are kept */
+ continue;
+ }
+ else if (obj->h_tid & GCFLAG_NURSERY_MOVED) {
+ /* visited nursery objects are kept and updated */
+ items[i] = (gcptr)obj->h_revision;
+ continue;
+ }
+ /* The listed object was not visited. Unlist it. */
+ items[i] = items[--d->list_of_read_objects.size];
+ }
+ d->num_read_objects_known_old = d->list_of_read_objects.size;
+ fxcache_clear(&d->recent_reads_cache);
+}
+
static void setup_minor_collect(struct tx_descriptor *d)
{
spinlock_acquire(d->public_descriptor->collection_lock, 'M'); /*minor*/
@@ -304,18 +329,13 @@
mark_private_from_protected(d);
visit_all_outside_objects(d);
-#if 0
+
fix_list_of_read_objects(d);
/* now all surviving nursery objects have been moved out, and all
surviving young-but-outside-the-nursery objects have been flagged
- with GCFLAG_OLD */
- finish_public_to_young(d);
-
- if (g2l_any_entry(&d->young_objects_outside_nursery))
- free_unvisited_young_objects_outside_nursery(d);
-#endif
-
+ with GCFLAG_OLD
+ */
teardown_minor_collect(d);
/* clear the nursery */
diff --git a/c4/nursery.h b/c4/nursery.h
--- a/c4/nursery.h
+++ b/c4/nursery.h
@@ -12,7 +12,8 @@
char *nursery_base; \
struct GcPtrList old_objects_to_trace; \
struct GcPtrList public_with_young_copy; \
- long num_private_from_protected_known_old;
+ long num_private_from_protected_known_old; \
+ long num_read_objects_known_old;
struct tx_descriptor; /* from et.h */
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit