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

Reply via email to