[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