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

bacek at svn.parrot.org bacek at svn.parrot.org
Sun May 30 22:24:03 UTC 2010


Author: bacek
Date: Sun May 30 22:24:03 2010
New Revision: 47173
URL: https://trac.parrot.org/parrot/changeset/47173

Log:
Allocate 'constant' PMCs from separate pool

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 22:23:27 2010	(r47172)
+++ branches/gc_massacre/src/gc/gc_tms.c	Sun May 30 22:24:03 2010	(r47173)
@@ -23,6 +23,7 @@
 typedef struct TriColor_GC {
     /* Allocator for PMC headers */
     struct Pool_Allocator *pmc_allocator;
+    struct Pool_Allocator *constant_pmc_allocator;
 
     struct Linked_List    *objects;
     struct Linked_List    *grey_objects;
@@ -536,6 +537,10 @@
 
     self->pmc_allocator = Parrot_gc_create_pool_allocator(
             sizeof (List_Item_Header) + sizeof (PMC));
+
+    self->constant_pmc_allocator = Parrot_gc_create_pool_allocator(
+            sizeof (List_Item_Header) + sizeof (PMC));
+
     self->objects = Parrot_gc_allocate_linked_list(interp);
 
     interp->gc_sys->gc_private = self;
@@ -544,15 +549,23 @@
 PARROT_MALLOC
 PARROT_CAN_RETURN_NULL
 static PMC*
-gc_tms_allocate_pmc_header(PARROT_INTERP, SHIM(UINTVAL flags))
+gc_tms_allocate_pmc_header(PARROT_INTERP, UINTVAL flags)
 {
     ASSERT_ARGS(gc_tms_allocate_pmc_header)
-    TriColor_GC *self = (TriColor_GC *)interp->gc_sys->gc_private;
+    TriColor_GC      *self = (TriColor_GC *)interp->gc_sys->gc_private;
+    List_Item_Header *ptr;
 
-    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);
+    /* Allocate "constant" PMCs from constant allocator and forget about them */
+    if (flags & PObj_constant_FLAG) {
+        ptr = (List_Item_Header *)Parrot_gc_pool_allocate(interp,
+            self->constant_pmc_allocator);
+    }
+    else {
+        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);
 }
@@ -609,7 +622,6 @@
         self.allocator.free($dead);
     }
     */
-    /* FIXME Move "constant" PMCs into @constant_pmcs */
     tmp = self->dead_objects->first;
     while (tmp) {
         List_Item_Header *next = tmp->next;
@@ -672,7 +684,7 @@
     ASSERT_ARGS(gc_tms_mark_pobj_header)
     if (obj) {
         if (PObj_is_PMC_TEST(obj))
-            gc_tms_mark_pmc_header(interp, (PObj *)obj);
+            gc_tms_mark_pmc_header(interp, (PMC *)obj);
         else
             PObj_live_SET(obj);
     }


More information about the parrot-commits mailing list