[svn:parrot] r49564 - branches/generational_gc/src/gc
bacek at svn.parrot.org
bacek at svn.parrot.org
Mon Oct 18 10:53:45 UTC 2010
Author: bacek
Date: Mon Oct 18 10:53:45 2010
New Revision: 49564
URL: https://trac.parrot.org/parrot/changeset/49564
Log:
Factor out function to move all cross-referenced objects to same 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 18 10:42:58 2010 (r49563)
+++ branches/generational_gc/src/gc/gc_ms2.c Mon Oct 18 10:53:45 2010 (r49564)
@@ -157,6 +157,11 @@
static void gc_ms2_block_GC_sweep(PARROT_INTERP)
__attribute__nonnull__(1);
+static void gc_ms2_bring_them_together(PARROT_INTERP,
+ ARGIN(List_Item_Header *old_object_tails[]))
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+
static void gc_ms2_check_sanity(PARROT_INTERP)
__attribute__nonnull__(1);
@@ -356,6 +361,9 @@
PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_gc_ms2_block_GC_sweep __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp))
+#define ASSERT_ARGS_gc_ms2_bring_them_together __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+ PARROT_ASSERT_ARG(interp) \
+ , PARROT_ASSERT_ARG(old_object_tails))
#define ASSERT_ARGS_gc_ms2_check_sanity __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_gc_ms2_compact_memory_pool __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
@@ -758,7 +766,46 @@
gc_ms2_check_sanity(interp);
+ gc_ms2_bring_them_together(interp, old_object_tails);
+
+
+ /* Now. Sweep all dead objects */
+ gc_ms2_sweep_pool(interp, self->pmc_allocator, self->objects[0], gc_ms2_sweep_pmc_cb);
+ if (gen >= 1)
+ gc_ms2_sweep_pool(interp, self->pmc_allocator, self->objects[1], gc_ms2_sweep_pmc_cb);
+ if (gen == 2)
+ gc_ms2_sweep_pool(interp, self->pmc_allocator, self->objects[2], gc_ms2_sweep_pmc_cb);
+
+
+ /* Update some stats */
+ interp->gc_sys->stats.header_allocs_since_last_collect = 0;
+ interp->gc_sys->stats.mem_used_last_collect = 0;
+ self->gc_mark_block_level--;
+
+ /* We swept all dead objects */
+ self->num_early_gc_PMCs = 0;
+
+ gc_ms2_compact_memory_pool(interp);
+
+ gc_ms2_check_sanity(interp);
+}
+
+/*
+=item C<static void gc_ms2_bring_them_together(PARROT_INTERP, List_Item_Header
+*old_object_tails[])>
+
+Bring all cross-referenced objects into same generation.
+
+TODO Give better name to this function.
+=cut
+*/
+static void
+gc_ms2_bring_them_together(PARROT_INTERP, ARGIN(List_Item_Header *old_object_tails[]))
+{
+ ASSERT_ARGS(gc_ms2_bring_them_together)
+ MarkSweep_GC *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
+ int i;
/*
* Last step. old_object_tails contains pointer to previous end of generation.
* We have to move old-to-young referenced objects into same generation.
@@ -769,16 +816,17 @@
interp->gc_sys->mark_str_header = gc_ms2_string_mark_propagate;
for (i = 2; i > 0; i--) {
- /* We are "marking" this generation */
- self->current_generation = i;
-
/* It can be our first move to this generation */
- tmp = old_object_tails[i]
- ? old_object_tails[i]
- : self->objects[i]->first;
+ List_Item_Header *tmp = old_object_tails[i]
+ ? old_object_tails[i]
+ : self->objects[i]->first;
+ // FIXME. Something wrong with updating tails.
tmp = self->objects[i]->first;
+ /* We are "marking" this generation */
+ self->current_generation = i;
+
while (tmp) {
PMC *pmc = LLH2Obj_typed(tmp, PMC);
@@ -798,25 +846,6 @@
interp->gc_sys->mark_pmc_header = gc_ms2_mark_pmc_header;
gc_ms2_check_sanity(interp);
- /* Now. Sweep all dead objects */
- gc_ms2_sweep_pool(interp, self->pmc_allocator, self->objects[0], gc_ms2_sweep_pmc_cb);
- if (gen >= 1)
- gc_ms2_sweep_pool(interp, self->pmc_allocator, self->objects[1], gc_ms2_sweep_pmc_cb);
- if (gen == 2)
- gc_ms2_sweep_pool(interp, self->pmc_allocator, self->objects[2], gc_ms2_sweep_pmc_cb);
-
-
- /* Update some stats */
- interp->gc_sys->stats.header_allocs_since_last_collect = 0;
- interp->gc_sys->stats.mem_used_last_collect = 0;
- self->gc_mark_block_level--;
-
- /* We swept all dead objects */
- self->num_early_gc_PMCs = 0;
-
- gc_ms2_compact_memory_pool(interp);
-
- gc_ms2_check_sanity(interp);
}
/*
More information about the parrot-commits
mailing list