[svn:parrot] r47163 - branches/gc_massacre/src/gc
bacek at svn.parrot.org
bacek at svn.parrot.org
Sun May 30 14:58:55 UTC 2010
Author: bacek
Date: Sun May 30 14:58:55 2010
New Revision: 47163
URL: https://trac.parrot.org/parrot/changeset/47163
Log:
First working version of TMS
Modified:
branches/gc_massacre/src/gc/gc_tms.c
Modified: branches/gc_massacre/src/gc/gc_tms.c
==============================================================================
--- branches/gc_massacre/src/gc/gc_tms.c Sun May 30 14:58:14 2010 (r47162)
+++ branches/gc_massacre/src/gc/gc_tms.c Sun May 30 14:58:55 2010 (r47163)
@@ -125,6 +125,9 @@
static void gc_tms_free_string_header(SHIM_INTERP, ARGFREE(STRING *s));
static size_t gc_tms_get_gc_info(SHIM_INTERP, SHIM(Interpinfo_enum what));
+static int gc_tms_is_pmc_ptr(PARROT_INTERP, ARGIN_NULLOK(void *ptr))
+ __attribute__nonnull__(1);
+
static void gc_tms_mark_and_sweep(PARROT_INTERP, UINTVAL flags)
__attribute__nonnull__(1);
@@ -132,6 +135,9 @@
__attribute__nonnull__(1)
__attribute__nonnull__(2);
+static void gc_tms_mark_pobj_header(PARROT_INTERP, ARGIN_NULLOK(PObj * obj))
+ __attribute__nonnull__(1);
+
static void gc_tms_real_mark_pmc(PARROT_INTERP,
ARGIN(struct TriColor_GC *self),
ARGIN(struct List_Item_Header *li))
@@ -196,11 +202,15 @@
PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_gc_tms_free_string_header __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
#define ASSERT_ARGS_gc_tms_get_gc_info __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
+#define ASSERT_ARGS_gc_tms_is_pmc_ptr __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+ PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_gc_tms_mark_and_sweep __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_gc_tms_mark_pmc_header __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(pmc))
+#define ASSERT_ARGS_gc_tms_mark_pobj_header __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+ PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_gc_tms_real_mark_pmc __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(self) \
@@ -465,6 +475,14 @@
ASSERT_ARGS(Parrot_gc_tms_init)
struct TriColor_GC *self;
+ /* Compatibility with "old" GC */
+ interp->mem_pools = mem_internal_allocate_zeroed_typed(Memory_Pools);
+ interp->mem_pools->num_sized = 0;
+ interp->mem_pools->num_attribs = 0;
+ interp->mem_pools->attrib_pools = NULL;
+ interp->mem_pools->sized_header_pools = NULL;
+
+
interp->gc_sys->do_gc_mark = gc_tms_mark_and_sweep;
interp->gc_sys->finalize_gc_system = NULL;
@@ -488,7 +506,9 @@
interp->gc_sys->allocate_pmc_attributes = gc_tms_allocate_pmc_attributes;
interp->gc_sys->free_pmc_attributes = gc_tms_free_pmc_attributes;
+ interp->gc_sys->is_pmc_ptr = gc_tms_is_pmc_ptr;
interp->gc_sys->mark_pmc_header = gc_tms_mark_pmc_header;
+ interp->gc_sys->mark_pobj_header = gc_tms_mark_pobj_header;
interp->gc_sys->allocate_string_storage = gc_tms_allocate_string_storage;
interp->gc_sys->reallocate_string_storage = gc_tms_reallocate_string_storage;
@@ -529,6 +549,7 @@
List_Item_Header *ptr = (List_Item_Header *)Parrot_gc_pool_allocate(interp,
self->pmc_allocator);
+ ptr->next = ptr->prev = NULL;
Parrot_gc_list_append(interp, self->objects, ptr);
return LLH2Obj_typed(ptr, PMC);
@@ -560,9 +581,14 @@
self->objects = Parrot_gc_allocate_linked_list(interp);
self->grey_objects = Parrot_gc_allocate_linked_list(interp);
+ //fprintf(stderr, "Before %d\n", self->dead_objects->count);
+
/*
self.grey_objects = self.trace_roots();
*/
+ Parrot_gc_trace_root(interp, interp->mem_pools, 0);
+
+ //fprintf(stderr, "Roots %d\n", self->grey_objects->count);
/*
# mark_alive will push into self.grey_objects
@@ -588,6 +614,9 @@
tmp = next;
}
+ //fprintf(stderr, "Survived %d\n", self->objects->count);
+ //fprintf(stderr, "Dead %d\n", self->dead_objects->count);
+
/* Clean up */
Parrot_gc_destroy_linked_list(interp, self->grey_objects);
Parrot_gc_destroy_linked_list(interp, self->dead_objects);
@@ -606,6 +635,8 @@
ASSERT_ARGS(gc_tms_mark_pmc_header)
TriColor_GC *self = (TriColor_GC *)interp->gc_sys->gc_private;
List_Item_Header *item = Obj2LLH(pmc);
+ if (PObj_is_live_or_free_TESTALL(pmc))
+ return;
Parrot_gc_list_remove(interp, self->dead_objects, item);
Parrot_gc_list_append(interp, self->grey_objects, item);
}
@@ -618,9 +649,32 @@
ASSERT_ARGS(gc_tms_real_mark_pmc)
Parrot_gc_list_remove(interp, self->grey_objects, li);
/* self.SUPER.mark($obj) */
+ Parrot_gc_list_append(interp, self->objects, li);
gc_ms_mark_pmc_header(interp, LLH2Obj_typed(li, PMC));
}
+static int
+gc_tms_is_pmc_ptr(PARROT_INTERP, ARGIN_NULLOK(void *ptr))
+{
+ ASSERT_ARGS(gc_tms_is_pmc_ptr)
+ TriColor_GC *self = (TriColor_GC *)interp->gc_sys->gc_private;
+ if (!ptr)
+ return 0;
+ return Parrot_gc_pool_is_owned(self->pmc_allocator, Obj2LLH(ptr));
+}
+
+static void
+gc_tms_mark_pobj_header(PARROT_INTERP, ARGIN_NULLOK(PObj * obj))
+{
+ ASSERT_ARGS(gc_tms_mark_pobj_header)
+ if (obj) {
+ if (PObj_is_PMC_TEST(obj))
+ gc_tms_mark_pmc_header(interp, (PObj *)obj);
+ else
+ PObj_live_SET(obj);
+ }
+}
+
/*
=item C<static void * gc_tms_allocate_memory_chunk(PARROT_INTERP, size_t size)>
More information about the parrot-commits
mailing list