[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