[svn:parrot] r49511 - branches/generational_gc/src/gc

bacek at svn.parrot.org bacek at svn.parrot.org
Mon Oct 11 08:54:23 UTC 2010


Author: bacek
Date: Mon Oct 11 08:54:23 2010
New Revision: 49511
URL: https://trac.parrot.org/parrot/changeset/49511

Log:
Special handling for oldest generation.

Modified:
   branches/generational_gc/src/gc/gc_ms2.c

Modified: branches/generational_gc/src/gc/gc_ms2.c
==============================================================================
--- branches/generational_gc/src/gc/gc_ms2.c	Mon Oct 11 08:54:03 2010	(r49510)
+++ branches/generational_gc/src/gc/gc_ms2.c	Mon Oct 11 08:54:23 2010	(r49511)
@@ -732,10 +732,40 @@
                         | PObj_GC_generation_1_FLAG
                         | PObj_GC_generation_2_FLAG);
                     pmc->flags |= generation_to_flags(i+1);
+                }
+            }
+
+            tmp = next;
+        }
+    }
 
-                    /* Paint white for next cycle */
-                    PObj_live_CLEAR(pmc);
+    /* Handling oldest generation. Don't move it further */
+    if (gen >= 1) {
+        tmp = self->objects[2]->first;
+        while (tmp) {
+            PMC                 *pmc = LLH2Obj_typed(tmp, PMC);
+            List_Item_Header    *next = tmp->next;
+
+            if (PObj_live_TEST(pmc)) {
+                /* "Seal" object with write barrier */
+                VTABLE  *t   = pmc->vtable;
+
+                if (!(t->flags & VTABLE_IS_WRITE_BARRIER_FLAG)) {
+                    PARROT_ASSERT(pmc->vtable);
+                    PARROT_ASSERT(pmc->vtable->wb_variant_vtable);
+
+                    pmc->vtable = pmc->vtable->wb_variant_vtable;
+                    pmc->vtable->wb_variant_vtable = t;
+
+                    PARROT_ASSERT(pmc->vtable != pmc->vtable->wb_variant_vtable);
+                    PARROT_ASSERT(pmc->vtable != pmc->vtable->ro_variant_vtable);
                 }
+
+                /* Move to older generation */
+                pmc->flags &= ~(PObj_GC_generation_0_FLAG
+                    | PObj_GC_generation_1_FLAG
+                    | PObj_GC_generation_2_FLAG);
+                pmc->flags |= generation_to_flags(2);
             }
 
             tmp = next;


More information about the parrot-commits mailing list