Author: Armin Rigo <ar...@tunes.org> 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 pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit