Author: Remi Meier <remi.me...@gmail.com>
Branch: copy-over-original2
Changeset: r404:74ae9fa5621f
Date: 2013-07-16 14:57 +0200
http://bitbucket.org/pypy/stmgc/changeset/74ae9fa5621f/

Log:    use NURSERY_MOVED instead of ~OLD when copying an object over its
        original during major collections

diff --git a/c4/gcpage.c b/c4/gcpage.c
--- a/c4/gcpage.c
+++ b/c4/gcpage.c
@@ -223,7 +223,7 @@
             id_copy->h_tid &= ~GCFLAG_PUBLIC_TO_PRIVATE;
             /* see fix_outdated() */
             id_copy->h_tid |= GCFLAG_VISITED;
-            assert(id_copy->h_tid & GCFLAG_OLD);
+            assert(!(id_copy->h_tid & GCFLAG_NURSERY_MOVED));
 
             /* XXX: may not always need tracing? */
             if (!(id_copy->h_tid & GCFLAG_STUB))
@@ -274,11 +274,11 @@
         /* for those visiting later: */
         obj->h_revision = (revision_t)id_copy;
 
-        /* mark as not old for transactions to fix their
+        /* mark as MOVED for transactions to fix their
            public_to_private. Otherwise, inevitable transactions
            would think their public obj was modified (also for
            other transactions, but they can abort) */
-        obj->h_tid &= ~GCFLAG_OLD;
+        obj->h_tid |= GCFLAG_NURSERY_MOVED;
         
         return id_copy;
     }
@@ -316,7 +316,7 @@
             }
 
             obj->h_tid |= GCFLAG_VISITED;
-            assert(obj->h_tid & GCFLAG_OLD);
+            assert(!(obj->h_tid & GCFLAG_NURSERY_MOVED));
 
             gcptrlist_insert(&objects_to_trace, obj);
 
@@ -341,7 +341,7 @@
             obj = (gcptr)(obj->h_revision - 2);
             if (!(obj->h_tid & GCFLAG_PUBLIC)) {
                 prev_obj->h_tid |= GCFLAG_VISITED;
-                assert(prev_obj->h_tid & GCFLAG_OLD);
+                assert(!(prev_obj->h_tid & GCFLAG_NURSERY_MOVED));
 
                 keep_original_alive(prev_obj);
 
@@ -385,10 +385,10 @@
         }
         
         obj->h_tid |= GCFLAG_VISITED;
-        assert(obj->h_tid & GCFLAG_OLD);
+        assert(!(obj->h_tid & GCFLAG_NURSERY_MOVED));
         assert(!(obj->h_tid & GCFLAG_STUB));
             
-        if (B->h_tid & GCFLAG_OLD) {
+        if (!(B->h_tid & GCFLAG_NURSERY_MOVED)) {
             B->h_tid |= GCFLAG_VISITED;
             assert(!(B->h_tid & GCFLAG_STUB));
             gcptrlist_insert2(&objects_to_trace, obj, B);
@@ -418,7 +418,7 @@
     if (!(obj->h_tid & GCFLAG_VISITED)) {
         obj->h_tid &= ~GCFLAG_PUBLIC_TO_PRIVATE;  /* see fix_outdated() */
         obj->h_tid |= GCFLAG_VISITED;
-        assert(obj->h_tid & GCFLAG_OLD);
+        assert(!(obj->h_tid & GCFLAG_NURSERY_MOVED));
         gcptrlist_insert(&objects_to_trace, obj);
 
         if (IS_POINTER(obj->h_revision)) {
@@ -516,7 +516,7 @@
         G2L_LOOP_FORWARD(d->public_to_private, item) {
             gcptr R = item->addr;
             gcptr L = item->val;
-            if (!(R->h_tid & GCFLAG_OLD)) {
+            if (R->h_tid & GCFLAG_NURSERY_MOVED) {
                 /* R was copied over its original */
                 gcptr new_R = (gcptr)R->h_original;
                 /* gcptrlist_insert(&objects_to_trace, new_R); */
@@ -600,7 +600,7 @@
         gcptr obj = items[i];
         assert(obj->h_tid & GCFLAG_PRIVATE_FROM_PROTECTED);
         /* we don't copy private / protected objects over prebuilts (yet) */
-        assert(obj->h_tid & GCFLAG_OLD);
+        assert(!(obj->h_tid & GCFLAG_NURSERY_MOVED));
 
         if (!(obj->h_tid & GCFLAG_VISITED)) {
             /* forget 'obj' */
@@ -615,7 +615,7 @@
     items = d->old_objects_to_trace.items;
     for (i = d->old_objects_to_trace.size - 1; i >= 0; i--) {
         gcptr obj = items[i];
-        assert(obj->h_tid & GCFLAG_OLD);
+        assert(!(obj->h_tid & GCFLAG_NURSERY_MOVED));
         assert(obj->h_tid & GCFLAG_VISITED);
     }
 #endif
@@ -636,7 +636,7 @@
         gcptr obj = items[i];
         assert(!(obj->h_tid & GCFLAG_STUB));
 
-        if (!(obj->h_tid & GCFLAG_OLD)) {
+        if (obj->h_tid & GCFLAG_NURSERY_MOVED) {
             assert(!(obj->h_tid & GCFLAG_PRIVATE_FROM_PROTECTED));
             obj = (gcptr)obj->h_revision;
             items[i] = obj;
@@ -652,7 +652,7 @@
             obj = (gcptr)obj->h_revision;
 
             /* the backup-ptr should already be updated: */
-            assert(obj->h_tid & GCFLAG_OLD);
+            assert(!(obj->h_tid & GCFLAG_NURSERY_MOVED));
         }
 
         revision_t v = obj->h_revision;
@@ -695,7 +695,7 @@
     G2L_LOOP_FORWARD(d->public_to_private, item) {
         assert(item->addr->h_tid & GCFLAG_VISITED);
         assert(item->val->h_tid & GCFLAG_VISITED);
-        assert(item->addr->h_tid & GCFLAG_OLD);
+        assert(!(item->addr->h_tid & GCFLAG_NURSERY_MOVED));
         assert(item->addr->h_tid & GCFLAG_PUBLIC);
         /* assert(is_private(item->val)); but in the other thread,
            which becomes: */
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to