[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