[svn:parrot] r40369 - in trunk: include/parrot src/gc

whiteknight at svn.parrot.org whiteknight at svn.parrot.org
Sun Aug 2 01:31:54 UTC 2009


Author: whiteknight
Date: Sun Aug  2 01:31:53 2009
New Revision: 40369
URL: https://trac.parrot.org/parrot/changeset/40369

Log:
[TT #895] some fixes to the new experimental code. Some bad pointer arithmetic was causing segfaults when I test these. Fix some problems, not all.

Modified:
   trunk/include/parrot/gc_api.h
   trunk/src/gc/api.c
   trunk/src/gc/mark_sweep.c

Modified: trunk/include/parrot/gc_api.h
==============================================================================
--- trunk/include/parrot/gc_api.h	Sat Aug  1 23:51:24 2009	(r40368)
+++ trunk/include/parrot/gc_api.h	Sun Aug  2 01:31:53 2009	(r40369)
@@ -189,7 +189,9 @@
         __attribute__nonnull__(2)
         FUNC_MODIFIES(*buffer);
 
-void Parrot_gc_allocate_pmc_attributes(PARROT_INTERP, ARGMOD(PMC *pmc))
+void * Parrot_gc_allocate_pmc_attributes(PARROT_INTERP,
+    ARGMOD(PMC *pmc),
+    size_t size)
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
         FUNC_MODIFIES(*pmc);
@@ -239,7 +241,9 @@
         FUNC_MODIFIES(*obj);
 
 PARROT_CANNOT_RETURN_NULL
-void Parrot_gc_free_pmc_attributes(PARROT_INTERP, ARGMOD(PMC *pmc))
+void Parrot_gc_free_pmc_attributes(PARROT_INTERP,
+    ARGMOD(PMC *pmc),
+    size_t item_size)
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
         FUNC_MODIFIES(*pmc);

Modified: trunk/src/gc/api.c
==============================================================================
--- trunk/src/gc/api.c	Sat Aug  1 23:51:24 2009	(r40368)
+++ trunk/src/gc/api.c	Sun Aug  2 01:31:53 2009	(r40369)
@@ -1661,9 +1661,11 @@
 
 /*
 
-=item C<void Parrot_gc_allocate_pmc_attributes(PARROT_INTERP, PMC *pmc)>
+=item C<void * Parrot_gc_allocate_pmc_attributes(PARROT_INTERP, PMC *pmc, size_t
+size)>
 
-=item C<void Parrot_gc_free_pmc_attributes(PARROT_INTERP, PMC *pmc)>
+=item C<void Parrot_gc_free_pmc_attributes(PARROT_INTERP, PMC *pmc, size_t
+item_size)>
 
 EXPERIMENTAL!!!
 
@@ -1676,23 +1678,26 @@
 
 */
 
-void
-Parrot_gc_allocate_pmc_attributes(PARROT_INTERP, ARGMOD(PMC *pmc))
+void *
+Parrot_gc_allocate_pmc_attributes(PARROT_INTERP, ARGMOD(PMC *pmc), size_t size)
 {
     ASSERT_ARGS(Parrot_gc_allocate_pmc_attributes)
-    const size_t attr_size = 0; /*pmc->vtable->attr_size; */
+    /* const size_t attr_size = pmc->vtable->attr_size; */
+    const size_t attr_size = size;
     PMC_Attribute_Pool * pool = Parrot_gc_get_attribute_pool(interp, attr_size);
     void * attrs = Parrot_gc_get_attributes_from_pool(interp, pool);
     PMC_data(pmc) = attrs;
+    return attrs;
 }
 
 PARROT_CANNOT_RETURN_NULL
 void
-Parrot_gc_free_pmc_attributes(PARROT_INTERP, ARGMOD(PMC *pmc))
+Parrot_gc_free_pmc_attributes(PARROT_INTERP, ARGMOD(PMC *pmc), size_t item_size)
 {
     ASSERT_ARGS(Parrot_gc_free_pmc_attributes)
     void * const data = PMC_data(pmc);
-    const size_t size = 0; /* pmc->vtable->attr_size; */
+    /* const size_t size = pmc->vtable->attr_size; */
+    const size_t size = item_size;
     if (data != NULL) {
         PMC_Attribute_Pool * const pool = Parrot_gc_get_attribute_pool(interp, size);
         PMC_Attribute_Free_List * const item = (PMC_Attribute_Free_List *)data;

Modified: trunk/src/gc/mark_sweep.c
==============================================================================
--- trunk/src/gc/mark_sweep.c	Sat Aug  1 23:51:24 2009	(r40368)
+++ trunk/src/gc/mark_sweep.c	Sun Aug  2 01:31:53 2009	(r40369)
@@ -1223,6 +1223,7 @@
     size_t const item_size = pool->attr_size;
     size_t i;
     PMC_Attribute_Free_List * list;
+    PMC_Attribute_Free_List * next;
     PMC_Attribute_Arena * const new_arena = (PMC_Attribute_Arena *)mem_internal_allocate(
         sizeof (PMC_Attribute_Arena) + (pool->attr_size * num_items));
     new_arena->used = 0;
@@ -1230,12 +1231,14 @@
     new_arena->prev = NULL;
     new_arena->next = pool->top_arena;
     pool->top_arena = new_arena;
-    list = (PMC_Attribute_Free_List *)(pool + 1);
+    next = (PMC_Attribute_Free_List *)(pool + 1);
     new_arena->start_objects = list;
     for (i = 0; i < num_items; i++) {
+        list = next;
         list->next = (PMC_Attribute_Free_List *)((char *)list + item_size);
-        list = list->next;
+        next = list->next;
     }
+    fprintf(stderr, "arena %d: %p - %p\n", item_size, new_arena->start_objects, list);
     list->next = pool->free_list;
     pool->free_list = (PMC_Attribute_Free_List *)new_arena->start_objects;
 }
@@ -1253,15 +1256,16 @@
         size_t total_size = idx + GC_ATTRIB_POOLS_HEADROOM;
         /* Allocate more then we strictly need, hoping that we can reduce the
            number of resizes. 8 is just an arbitrary number */
-        pools = (PMC_Attribute_Pool **)mem_internal_allocate(total_size);
+        pools = (PMC_Attribute_Pool **)mem_internal_allocate(total_size * sizeof (PMC_Attribute_Pool *));
         memset(pools, 0, total_size * sizeof (void*));
+        arenas->attrib_pools = pools;
         arenas->num_attribs = total_size;
     }
     if (arenas->num_attribs < idx) {
         size_t total_size = idx + GC_ATTRIB_POOLS_HEADROOM;
         size_t current_size = arenas->num_attribs;
         size_t diff = total_size - current_size;
-        pools = (PMC_Attribute_Pool **)mem_internal_realloc(pools, total_size);
+        pools = (PMC_Attribute_Pool **)mem_internal_realloc(pools, total_size * sizeof (PMC_Attribute_Pool *));
         memset(pools + current_size, 0, diff * sizeof (void *));
         arenas->attrib_pools = pools;
         arenas->num_attribs = total_size;


More information about the parrot-commits mailing list