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

bacek at svn.parrot.org bacek at svn.parrot.org
Wed Jun 2 09:56:56 UTC 2010


Author: bacek
Date: Wed Jun  2 09:56:56 2010
New Revision: 47290
URL: https://trac.parrot.org/parrot/changeset/47290

Log:
A lot of fixes for TMS.

* Properly handle tail-of-greyobjects. Previously next-after-last wasn't
  marked
* Don't GC during deinitialise
* Embed gc_ms_mark into gc_tms_mark for simplicity and performance.

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	Wed Jun  2 09:56:44 2010	(r47289)
+++ branches/gc_massacre/src/gc/gc_tms.c	Wed Jun  2 09:56:56 2010	(r47290)
@@ -641,6 +641,11 @@
     if (self->gc_mark_block_level)
         return;
 
+    if (flags & GC_finish_FLAG) {
+        /* FIXME Cleanup here */
+        return;
+    }
+
     ++self->gc_mark_block_level;
 
     /*
@@ -662,6 +667,12 @@
     */
     Parrot_gc_trace_root(interp, NULL, GC_TRACE_FULL);
 
+    if (interp->pdb && interp->pdb->debugger) {
+        Parrot_gc_trace_root(interp->pdb->debugger, NULL, 0);
+    }
+
+    gc_tms_mark_pmc_header(interp, PMCNULL);
+
     //fprintf(stderr, "Roots %zd\n", self->grey_objects->count);
     PARROT_ASSERT(Parrot_gc_list_check(interp, self->grey_objects));
 
@@ -669,18 +680,16 @@
     # mark_alive will push into self.grey_objects
     self.mark_real($_) for self.grey_objects;
     */
-    tmp = self->grey_objects->first;
     counter = 0;
-    while (tmp) {
-        List_Item_Header *next = tmp->next;
+    while (self->grey_objects->first) {
+        tmp = self->grey_objects->first;
         PARROT_ASSERT(tmp->owner == self->grey_objects);
+
+        Parrot_gc_list_remove(interp, self->grey_objects, tmp);
         PARROT_ASSERT(PObj_grey_TEST(LLH2Obj_typed(tmp, PMC)));
+
         gc_tms_real_mark_pmc(interp, self, tmp);
-        tmp = next;
         ++counter;
-
-        PARROT_ASSERT(Parrot_gc_list_check(interp, self->grey_objects));
-        PARROT_ASSERT(Parrot_gc_list_check(interp, self->dead_objects));
     }
 
     //fprintf(stderr, "Processed grey: %zd\n", counter);
@@ -773,11 +782,25 @@
         ARGIN(struct List_Item_Header *li))
 {
     ASSERT_ARGS(gc_tms_real_mark_pmc)
-    Parrot_gc_list_remove(interp, self->grey_objects, li);
+    PMC *obj = LLH2Obj_typed(li, PMC);
+    //Parrot_gc_list_remove(interp, self->grey_objects, li);
     Parrot_gc_list_append(interp, self->black_objects, li);
-    PObj_grey_CLEAR(LLH2Obj_typed(li, PMC));
+    PObj_grey_CLEAR(obj);
     /* self.SUPER.mark($obj) */
-    gc_ms_mark_pmc_header(interp, LLH2Obj_typed(li, PMC));
+    //gc_ms_mark_pmc_header(interp, LLH2Obj_typed(li, PMC));
+
+    /* mark it live */
+    PObj_live_SET(obj);
+
+    /* 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(obj)) {
+        if (PObj_custom_mark_TEST(obj))
+            VTABLE_mark(interp, obj);
+    }
+
+    if (PMC_metadata(obj))
+        Parrot_gc_mark_PMC_alive(interp, PMC_metadata(obj));
 }
 
 static int
@@ -791,8 +814,8 @@
     if (!Parrot_gc_pool_is_owned(self->pmc_allocator, Obj2LLH(ptr)))
         return 0;
 
+#if 1 
     /* Pool.is_owned isn't precise enough (yet) */
-    /*
     if (Parrot_gc_list_is_owned(interp, self->grey_objects, item))
         return 1;
     if (Parrot_gc_list_is_owned(interp, self->dead_objects, item))


More information about the parrot-commits mailing list