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)>

Reply via email to