Author: heimdall
Date: Sun Aug 7 13:48:28 2005
New Revision: 8861
Modified:
branches/gmc/include/parrot/pobj.h
branches/gmc/src/gc_gmc.c
branches/gmc/src/headers.c
branches/gmc/src/smallobject.c
Log:
Various bugfixes for pmc_body. Compiles and run but make test still fails on
some glibc corruption with string structure.
Modified: branches/gmc/include/parrot/pobj.h
==============================================================================
--- branches/gmc/include/parrot/pobj.h (original)
+++ branches/gmc/include/parrot/pobj.h Sun Aug 7 13:48:28 2005
@@ -97,6 +97,7 @@ typedef Buffer PObj;
#define PObj_bufstart(pmc) (pmc)->obj.u._b._bufstart
#define PObj_buflen(pmc) (pmc)->obj.u._b._buflen
+#define PMC_body(pmc) (pmc)->body
#define PMC_struct_val(pmc) (pmc)->body->_ptrs._struct_val
#define PMC_pmc_val(pmc) (pmc)->body->_ptrs._pmc_val
#define PMC_int_val(pmc) (pmc)->body->_i._int_val
Modified: branches/gmc/src/gc_gmc.c
==============================================================================
--- branches/gmc/src/gc_gmc.c (original)
+++ branches/gmc/src/gc_gmc.c Sun Aug 7 13:48:28 2005
@@ -2,22 +2,22 @@
#if PARROT_GC_GMC
-static void gc_gmc_pool_init(Interp *interpreter, struct Small_Object_Pool
*pool)
+/*static void gc_gmc_pool_init(Interp *interpreter, struct Small_Object_Pool
*pool)
{
-}
+}*/
-static void gc_gmc_deinit(Interp *interpreter)
+void gc_gmc_deinit(Interp *interpreter)
{
}
-static void gc_gmc_run(Interp *interpreter, int flags)
+void gc_gmc_run(Interp *interpreter, int flags)
{
}
-void Parrot_gc_gmc_init(Interp *interpreter)
+/*void Parrot_gc_gmc_init(Interp *interpreter)
{
struct Arenas *arena_base;
@@ -26,11 +26,29 @@ void Parrot_gc_gmc_init(Interp *interpre
arena_base->do_dod_run = gc_gmc_run;
arena_base->de_init_gc_system = gc_gmc_deinit;
arena_base->init_pool = gc_gmc_pool_init;
-}
+}*/
+
-void gc_pmc_body_pool_init(Interp *interpreter, struct Small_Object_Pool *pool)
+/* Small adaptation of gc_ms_free_object. Does not yet use GMC at all. */
+
+void *
+gc_gmc_get_free_object(Interp *interpreter,
+ struct Small_Object_Pool *pool)
{
+ void *ptr;
+ /* if we don't have any objects */
+ if (!pool->free_list)
+ (*pool->more_objects) (interpreter, pool);
+ ptr = pool->free_list;
+ pool->free_list = *(void **)ptr;
+ --pool->num_free_objects;
+#if ! DISABLE_GC_DEBUG
+ if (GC_DEBUG(interpreter))
+ PObj_version((Buffer*)ptr) = interpreter->arena_base->dod_runs;
+#endif
+ return ptr;
}
+
#endif /* PARROT_GC_GMC */
Modified: branches/gmc/src/headers.c
==============================================================================
--- branches/gmc/src/headers.c (original)
+++ branches/gmc/src/headers.c Sun Aug 7 13:48:28 2005
@@ -304,13 +304,10 @@ Basically same as new_pmc_ext.
static pmc_body *
new_pmc_body(Interp *interpreter)
{
- struct Small_Object_Pool *pool = interpreter->arena_base->pmc_ext_pool;
+ struct Small_Object_Pool *pool = interpreter->arena_base->pmc_body_pool;
void *ptr;
- if (!pool->free_list)
- (*pool->more_objects) (interpreter, pool);
- ptr = pool->free_list;
- pool->free_list = *(void **)ptr;
+ ptr = pool->get_free_object (interpreter, pool);
memset(ptr, 0, sizeof(pmc_body));
return ptr;
}
@@ -633,9 +630,8 @@ Parrot_initialize_header_pools(Interp *i
arena_base->pmc_ext_pool->name = "pmc_ext";
#if PARROT_GC_GMC
- /*
- * pmc_body is gmc specific, so use functions of src/gmc.c.
- */
+ arena_base->pmc_body_pool =
+ new_small_object_pool(interpreter, sizeof(pmc_body), 1024);
gc_pmc_body_pool_init(interpreter, arena_base->pmc_body_pool);
arena_base->pmc_body_pool->name = "pmc_body";
#endif
Modified: branches/gmc/src/smallobject.c
==============================================================================
--- branches/gmc/src/smallobject.c (original)
+++ branches/gmc/src/smallobject.c Sun Aug 7 13:48:28 2005
@@ -211,7 +211,7 @@ Adds the memory between C<start> and C<e
*/
- void
+ void
Parrot_add_to_free_list(Interp *interpreter,
struct Small_Object_Pool *pool,
struct Small_Object_Arena *arena,
@@ -482,6 +482,47 @@ gc_ms_pool_init(Interp *interpreter, str
#endif
}
+#if PARROT_GC_GMC
+
+void* gc_gmc_get_free_object(Interp*, struct Small_Object_Pool*);
+
+void
+gc_pmc_body_pool_init(Interp *interpreter, struct Small_Object_Pool *pool)
+{
+ pool->add_free_object = gc_ms_add_free_object;
+ pool->get_free_object = gc_gmc_get_free_object;
+ pool->alloc_objects = gc_ms_alloc_objects;
+ pool->more_objects = gc_ms_alloc_objects;
+}
+
+/* Workaround before the corresponding gmc functions are implemented.
+ * TODO: get our real functions ! */
+
+void gc_gmc_deinit(Interp*);
+void gc_gmc_run(Interp*, int);
+
+static void
+gc_gmc_pool_init(Interp *interpreter, struct Small_Object_Pool *pool)
+{
+ pool->add_free_object = gc_ms_add_free_object;
+ pool->get_free_object = gc_ms_get_free_object;
+ pool->alloc_objects = gc_ms_alloc_objects;
+ pool->more_objects = more_traceable_objects;
+}
+
+
+void Parrot_gc_gmc_init(Interp *interpreter)
+{
+ struct Arenas *arena_base;
+
+ arena_base = interpreter->arena_base;
+ arena_base->do_dod_run = gc_gmc_run;
+ arena_base->de_init_gc_system = gc_gmc_deinit;
+ arena_base->init_pool = gc_gmc_pool_init;
+}
+
+#endif
+
/*
=item C<void Parrot_gc_ms_init(Interp* interpreter)>