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

bacek at svn.parrot.org bacek at svn.parrot.org
Mon Sep 27 10:23:09 UTC 2010


Author: bacek
Date: Mon Sep 27 10:23:08 2010
New Revision: 49351
URL: https://trac.parrot.org/parrot/changeset/49351

Log:
Factor out mark_string_header. We do need to move strings between
generations.

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 Sep 27 08:53:27 2010	(r49350)
+++ branches/generational_gc/src/gc/gc_ms2.c	Mon Sep 27 10:23:08 2010	(r49351)
@@ -237,6 +237,10 @@
 static void gc_ms2_mark_pobj_header(PARROT_INTERP, ARGIN_NULLOK(PObj * obj))
         __attribute__nonnull__(1);
 
+static void gc_ms2_mark_string_header(PARROT_INTERP, ARGIN(STRING *str))
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(2);
+
 static void gc_ms2_maybe_mark_and_sweep(PARROT_INTERP)
         __attribute__nonnull__(1);
 
@@ -378,6 +382,9 @@
     , PARROT_ASSERT_ARG(pmc))
 #define ASSERT_ARGS_gc_ms2_mark_pobj_header __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp))
+#define ASSERT_ARGS_gc_ms2_mark_string_header __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(str))
 #define ASSERT_ARGS_gc_ms2_maybe_mark_and_sweep __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp))
 #define ASSERT_ARGS_gc_ms2_pmc_needs_early_collection \
@@ -991,6 +998,38 @@
     interp->gc_sys->stats.mem_used_last_collect += size;
 }
 
+static void
+gc_ms2_mark_string_header(PARROT_INTERP, ARGIN(STRING *str))
+{
+    ASSERT_ARGS(gc_ms2_mark_string_header)
+    MarkSweep_GC      *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
+    List_Item_Header  *item = Obj2LLH(str);
+    size_t             gen  = PObj_to_generation(str);
+
+    /* If object too old - skip it */
+    if (gen > self->current_generation)
+        return;
+
+    /* Object was already marked as grey. Or live. Or dead. Skip it */
+    if (PObj_is_live_or_free_TESTALL(str))
+        return;
+
+    /* External/sysmem/whaever strings aren't managed by GC */
+    if (!PObj_is_movable_TESTALL(str))
+        return;
+
+    /* mark it live */
+    PObj_live_SET(str);
+
+    PARROT_ASSERT(Parrot_list_contains(interp, self->strings[gen], Obj2LLH(str)));
+
+    /* Move to young generation */
+    if (gen) {
+        LIST_REMOVE(self->strings[gen], item);
+        LIST_APPEND(self->strings[0], item);
+        str->flags &= ~(PObj_GC_generation_0_FLAG | PObj_GC_generation_1_FLAG);
+    }
+}
 /*
 
 =item C<static void gc_ms2_mark_pobj_header(PARROT_INTERP, PObj * obj)>
@@ -1008,8 +1047,9 @@
     if (obj) {
         if (PObj_is_PMC_TEST(obj))
             gc_ms2_mark_pmc_header(interp, (PMC *)obj);
-        else
-            PObj_live_SET(obj);
+        else {
+            gc_ms2_mark_string_header(interp, (STRING *)obj);
+        }
     }
 }
 


More information about the parrot-commits mailing list