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

bacek at svn.parrot.org bacek at svn.parrot.org
Sun Oct 24 21:08:01 UTC 2010


Author: bacek
Date: Sun Oct 24 21:08:01 2010
New Revision: 49650
URL: https://trac.parrot.org/parrot/changeset/49650

Log:
Ressurect usage of GC_generational_2_FLAG for bringing objects into same
generation.

Main reason - we still have to process objects from current generation
because they can have fresh references to young objects.

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	Sun Oct 24 21:07:50 2010	(r49649)
+++ branches/generational_gc/src/gc/gc_ms2.c	Sun Oct 24 21:08:01 2010	(r49650)
@@ -911,10 +911,12 @@
         /* We are "marking" this generation */
         self->current_generation = i;
 
+        /* mark can append more objects to this list */
         while (tmp) {
             PMC *pmc = LLH2Obj_typed(tmp, PMC);
 
-            /* mark can append more objects to this list */
+            pmc->flags |= PObj_GC_generation_2_FLAG;
+
             if (PObj_custom_mark_TEST(pmc))
                 VTABLE_mark(interp, pmc);
 
@@ -993,7 +995,10 @@
     if (PObj_constant_TEST(pmc))
         return;
 
-    PARROT_ASSERT(pobj2gen(pmc) == self->current_generation
+    if (pmc->flags & PObj_GC_generation_2_FLAG)
+        return;
+
+    PARROT_ASSERT(pobj2gen(pmc) >= self->current_generation
                   || !"Got object from wrong generation");
 
     pmc->flags |= PObj_GC_generation_2_FLAG;
@@ -1586,11 +1591,13 @@
     if (pmc->flags & PObj_constant_FLAG)
         return;
 
-    if (gen != self->current_generation) {
-        LIST_REMOVE(self->objects[gen], item);
-        LIST_APPEND(self->objects[self->current_generation], item);
-        gc_ms2_set_gen_flags(interp, (PObj *)pmc, self->current_generation);
-    }
+    /* PMC was already processed */
+    if (pmc->flags & PObj_GC_generation_2_FLAG)
+        return;
+
+    LIST_REMOVE(self->objects[gen], item);
+    LIST_APPEND(self->objects[self->current_generation], item);
+    gc_ms2_set_gen_flags(interp, pmc, self->current_generation);
 
     PObj_live_SET(pmc);
 }
@@ -1652,7 +1659,7 @@
         if (PObj_live_TEST(obj)) {
             /* Paint live objects white */
             PObj_live_CLEAR(obj);
-            obj->flags &= ~PObj_GC_wb_triggered_FLAG;
+            obj->flags &= ~(PObj_GC_wb_triggered_FLAG | PObj_GC_generation_2_FLAG);
         }
         else if (!PObj_constant_TEST(obj)) {
             callback(interp, obj);


More information about the parrot-commits mailing list