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

bacek at svn.parrot.org bacek at svn.parrot.org
Mon May 31 10:19:40 UTC 2010


Author: bacek
Date: Mon May 31 10:19:40 2010
New Revision: 47204
URL: https://trac.parrot.org/parrot/changeset/47204

Log:
More fixes to 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	Mon May 31 10:19:14 2010	(r47203)
+++ branches/gc_massacre/src/gc/gc_tms.c	Mon May 31 10:19:40 2010	(r47204)
@@ -582,6 +582,7 @@
     ASSERT_ARGS(gc_tms_allocate_pmc_header)
     TriColor_GC      *self = (TriColor_GC *)interp->gc_sys->gc_private;
     List_Item_Header *ptr;
+    PMC              *ret;
 
     /* Allocate "constant" PMCs from constant allocator and forget about them */
     if (flags & PObj_constant_FLAG) {
@@ -594,11 +595,14 @@
         Parrot_gc_list_append(interp, self->objects, ptr);
     }
 
+    /* Save real pointer on stack. Otherwise it will not be traced */
+    ret = LLH2Obj_typed(ptr, PMC);
+
     if (++self->header_allocs_since_last_collect > 1024) {
         gc_tms_mark_and_sweep(interp, 0);
     }
 
-    return LLH2Obj_typed(ptr, PMC);
+    return ret;
 }
 
 static void
@@ -607,8 +611,12 @@
     ASSERT_ARGS(gc_tms_free_pmc_header)
     TriColor_GC *self = (TriColor_GC *)interp->gc_sys->gc_private;
 
-    if (pmc)
+    if (pmc) {
+        if (PObj_on_free_list_TEST(pmc))
+            return;
         Parrot_gc_pool_free(self->pmc_allocator, Obj2LLH(pmc));
+        PObj_on_free_list_SET(pmc);
+    }
 }
 
 static void
@@ -638,7 +646,7 @@
     /*
     self.grey_objects  = self.trace_roots();
     */
-    Parrot_gc_trace_root(interp, NULL, 0);
+    Parrot_gc_trace_root(interp, NULL, GC_TRACE_FULL);
 
     //fprintf(stderr, "Roots %d\n", self->grey_objects->count);
 
@@ -648,8 +656,9 @@
     */
     tmp = self->grey_objects->first;
     while (tmp) {
+        List_Item_Header *next = tmp->next;
         gc_tms_real_mark_pmc(interp, self, tmp);
-        tmp = tmp->next;
+        tmp = next;
     }
 
     /*
@@ -666,8 +675,8 @@
         tmp = next;
     }
 
-    //fprintf(stderr, "Survived %d\n", self->objects->count);
-    //fprintf(stderr, "Dead %d\n", self->dead_objects->count);
+    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);


More information about the parrot-commits mailing list