[svn:parrot] r47365 - branches/gc_massacre/src/gc

bacek at svn.parrot.org bacek at svn.parrot.org
Sat Jun 5 00:12:21 UTC 2010


Author: bacek
Date: Sat Jun  5 00:12:21 2010
New Revision: 47365
URL: https://trac.parrot.org/parrot/changeset/47365

Log:
Shuffle functions around.

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

Modified: branches/gc_massacre/src/gc/gc_ms2.c
==============================================================================
--- branches/gc_massacre/src/gc/gc_ms2.c	Sat Jun  5 00:12:09 2010	(r47364)
+++ branches/gc_massacre/src/gc/gc_ms2.c	Sat Jun  5 00:12:21 2010	(r47365)
@@ -51,6 +51,9 @@
 
 } MarkSweep_GC;
 
+/* Callback to destroy PMC or free string storage */
+typedef void (*sweep_cb)(PARROT_INTERP, PObj *obj);
+
 /* HEADERIZER HFILE: src/gc/gc_private.h */
 
 /* HEADERIZER BEGIN: static */
@@ -618,10 +621,67 @@
             return;
         Parrot_gc_list_remove(interp, self->objects, Obj2LLH(pmc));
         PObj_on_free_list_SET(pmc);
+
+        Parrot_pmc_destroy(interp, pmc);
+
         Parrot_gc_pool_free(self->pmc_allocator, Obj2LLH(pmc));
     }
 }
 
+/*
+
+=item C<static void gc_ms2_mark_pmc_header(PARROT_INTERP, PMC *pmc)>
+
+mark as grey
+
+=cut
+
+*/
+
+static void
+gc_ms2_mark_pmc_header(PARROT_INTERP, ARGIN(PMC *pmc))
+{
+    ASSERT_ARGS(gc_ms2_mark_pmc_header)
+    MarkSweep_GC      *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
+    List_Item_Header  *item = Obj2LLH(pmc);
+
+    /* Object was already marked as grey. Or live. Or dead. Skip it */
+    if (PObj_is_live_or_free_TESTALL(pmc))
+        return;
+
+    /* mark it live */
+    PObj_live_SET(pmc);
+
+    /* if object is a PMC and contains buffers or PMCs, then attach the PMC
+     * to the chained mark list. */
+    if (PObj_is_special_PMC_TEST(pmc)) {
+        if (PObj_custom_mark_TEST(pmc))
+            VTABLE_mark(interp, pmc);
+    }
+
+    if (PMC_metadata(pmc))
+        Parrot_gc_mark_PMC_alive(interp, PMC_metadata(pmc));
+}
+
+/*
+
+=item C<static int gc_ms2_is_pmc_ptr(PARROT_INTERP, void *ptr)>
+
+establish if *ptr is.owned
+
+=cut
+
+*/
+
+static int
+gc_ms2_is_pmc_ptr(PARROT_INTERP, ARGIN_NULLOK(void *ptr))
+{
+    ASSERT_ARGS(gc_ms2_is_pmc_ptr)
+    MarkSweep_GC      *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
+    return gc_ms2_is_ptr_owned(interp, ptr, self->pmc_allocator, self->objects);
+}
+
+
 PARROT_MALLOC
 PARROT_CAN_RETURN_NULL
 static STRING*
@@ -655,6 +715,37 @@
     }
 }
 
+static int
+gc_ms2_is_string_ptr(PARROT_INTERP, ARGIN_NULLOK(void *ptr))
+{
+    ASSERT_ARGS(gc_ms2_is_pmc_ptr)
+    MarkSweep_GC      *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
+    return gc_ms2_is_ptr_owned(interp, ptr, self->string_allocator, self->strings);
+}
+
+/*
+
+=item C<static void gc_ms2_mark_pobj_header(PARROT_INTERP, PObj * obj)>
+
+Mark PObj as live.
+
+=cut
+
+*/
+
+static void
+gc_ms2_mark_pobj_header(PARROT_INTERP, ARGIN_NULLOK(PObj * obj))
+{
+    ASSERT_ARGS(gc_ms2_mark_pobj_header)
+    if (obj) {
+        if (PObj_is_PMC_TEST(obj))
+            gc_ms2_mark_pmc_header(interp, (PMC *)obj);
+        else
+            PObj_live_SET(obj);
+    }
+}
+
+
 static void
 gc_ms2_mark_and_sweep(PARROT_INTERP, UINTVAL flags)
 {
@@ -692,66 +783,7 @@
     self->gc_mark_runs++;
 }
 
-/*
-
-=item C<static void gc_ms2_mark_pmc_header(PARROT_INTERP, PMC *pmc)>
-
-mark as grey
-
-=cut
-
-*/
-
-static void
-gc_ms2_mark_pmc_header(PARROT_INTERP, ARGIN(PMC *pmc))
-{
-    ASSERT_ARGS(gc_ms2_mark_pmc_header)
-    MarkSweep_GC      *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
-    List_Item_Header  *item = Obj2LLH(pmc);
-
-    /* Object was already marked as grey. Or live. Or dead. Skip it */
-    if (PObj_is_live_or_free_TESTALL(pmc))
-        return;
-
-    /* mark it live */
-    PObj_live_SET(pmc);
-
-    /* if object is a PMC and contains buffers or PMCs, then attach the PMC
-     * to the chained mark list. */
-    if (PObj_is_special_PMC_TEST(pmc)) {
-        if (PObj_custom_mark_TEST(pmc))
-            VTABLE_mark(interp, pmc);
-    }
-
-    if (PMC_metadata(pmc))
-        Parrot_gc_mark_PMC_alive(interp, PMC_metadata(pmc));
-}
-
-/*
-
-=item C<static int gc_ms2_is_pmc_ptr(PARROT_INTERP, void *ptr)>
-
-establish if *ptr is.owned
-
-=cut
-
-*/
 
-static int
-gc_ms2_is_pmc_ptr(PARROT_INTERP, ARGIN_NULLOK(void *ptr))
-{
-    ASSERT_ARGS(gc_ms2_is_pmc_ptr)
-    MarkSweep_GC      *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
-    return gc_ms2_is_ptr_owned(interp, ptr, self->pmc_allocator, self->objects);
-}
-
-static int
-gc_ms2_is_string_ptr(PARROT_INTERP, ARGIN_NULLOK(void *ptr))
-{
-    ASSERT_ARGS(gc_ms2_is_pmc_ptr)
-    MarkSweep_GC      *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
-    return gc_ms2_is_ptr_owned(interp, ptr, self->string_allocator, self->strings);
-}
 
 /*
 =item C<static void gc_ms2_sweep_pool(PARROT_INTERP, Pool_Allocator *pool,
@@ -764,8 +796,8 @@
 static void
 gc_ms2_sweep_pool(PARROT_INTERP, ARGIN(Pool_Allocator *pool), ARGIN(Linked_List *list))
 {
-    ASSERT_ARGS(gc_ms2_sweep_pool);
-    tmp = list->first;
+    ASSERT_ARGS(gc_ms2_sweep_pool)
+    List_Item_Header *tmp = list->first;
     while (tmp) {
         List_Item_Header *next = tmp->next;
         PObj             *obj  = LLH2Obj_typed(tmp, PObj);
@@ -775,13 +807,15 @@
         }
         else if (!PObj_constant_TEST(obj)) {
             PObj_on_free_list_SET(obj);
-            LIST_REMOVE(list, obj);
-            Parrot_gc_pool_free(pool, obj);
+            LIST_REMOVE(list, tmp);
+            Parrot_gc_pool_free(pool, tmp);
         }
         tmp = next;
     }
 }
 
+
+
 /*
 =item C<static int gc_ms2_is_ptr_owned(PARROT_INTERP, void *ptr, Pool_Allocator
 *pool, Linked_List *list)>
@@ -817,28 +851,6 @@
     return 0;
 }
 
-/*
-
-=item C<static void gc_ms2_mark_pobj_header(PARROT_INTERP, PObj * obj)>
-
-if already marked mark as grey else make as live
-
-=cut
-
-*/
-
-static void
-gc_ms2_mark_pobj_header(PARROT_INTERP, ARGIN_NULLOK(PObj * obj))
-{
-    ASSERT_ARGS(gc_ms2_mark_pobj_header)
-    if (obj) {
-        if (PObj_is_PMC_TEST(obj))
-            gc_ms2_mark_pmc_header(interp, (PMC *)obj);
-        else
-            PObj_live_SET(obj);
-    }
-}
-
 
 /*
 


More information about the parrot-commits mailing list