Author: heimdall
Date: Sun Aug 14 07:36:03 2005
New Revision: 8960

Modified:
   branches/gmc/src/gc_gmc.c
   branches/gmc/src/memory.c
Log:
Bugfix in generation allocation

Modified: branches/gmc/src/gc_gmc.c
==============================================================================
--- branches/gmc/src/gc_gmc.c   (original)
+++ branches/gmc/src/gc_gmc.c   Sun Aug 14 07:36:03 2005
@@ -68,7 +68,10 @@ gc_gmc_insert_gen(Interp *interpreter, G
     while ((UINTVAL)ptr > (UINTVAL)gen->first)
     {
       cur_gen = cur_gen->prev;
-      ptr = cur_gen->first;
+      if (cur_gen)
+         ptr = cur_gen->first;
+      else
+         ptr = NULL;
     }
     
     /* Insert the generation. */
@@ -78,18 +81,42 @@ gc_gmc_insert_gen(Interp *interpreter, G
       {
        cur_gen->next->prev = gen;
       }
-      cur_gen->next = gen;
       gen->next = cur_gen->next;
+      cur_gen->next = gen;
     } else {
-      gen->next = NULL;
-      gc->yng_fst = gen;
-      gc->old_lst = gen;
+       if (gc->yng_fst)
+       {
+           gen->next = gc->yng_fst;
+           gc->yng_fst->prev = gen;
+           gc->yng_fst = gen;
+       } else {
+           gen->next = NULL;
+           gc->yng_fst = gen;
+           gc->old_lst = gen;
+       }
     }
     gen->prev = cur_gen;
     if (gc->old_lst == cur_gen)
       gc->old_lst = gen;
 }
 
+static void
+gc_gmc_test_linked_list_gen(Interp *interpreter, Gc_gmc *gc)
+{
+    Gc_gmc_gen *gen;
+    UINTVAL i,j;
+    for (i = 0, gen = gc->yng_fst; gen; i++, gen = gen->next);
+    for (j = 0, gen = gc->old_lst; gen; j++, gen = gen->prev);
+    if (i != gc->nb_gen || j != gc->nb_gen)
+    {
+       fprintf(stderr, "Invalid linked list : %d elem instead of %d\n", i, 
gc->nb_gen);
+       fprintf(stderr, "Invalid linked list : %d elem instead of %d\n", j, 
gc->nb_gen);
+       gen = NULL;
+       *(int*)gen = 54;
+    } else
+       fprintf(stderr, "Linked list is OK !\n");
+}
+
 static void gc_gmc_pool_deinit(Interp *, struct Small_Object_Pool *);
 
 static void 
@@ -126,6 +153,8 @@ gc_gmc_pool_init(Interp *interpreter, st
        gc_gmc_insert_gen(interpreter, gc, gen);
     }
 
+    gc_gmc_test_linked_list_gen(interpreter, gc);
+
     /* Separate the generations in two halves : one is young (= aggregate
      * objects), the other is old (non-aggregate objects). */
     for (i = 0, gen = gc->yng_fst; i < (GMC_GEN_INIT_NUMBER/2); i++, gen = 
gen->next);
@@ -255,7 +284,7 @@ gc_gmc_get_free_object_of_size(Interp *i
   gen = (aggreg) ? gc->yng_lst : gc->old_lst;
 
   /* Should we use the next generation ? */
-  if (size > gen->remaining)
+  if (size >= gen->remaining)
   {
       if (aggreg)
          gc->yng_lst = gen->next;
@@ -271,7 +300,7 @@ gc_gmc_get_free_object_of_size(Interp *i
   gen = (aggreg) ? gc->yng_lst : gc->old_lst;
 
   /* Should we use the next generation ? */
-  if (size > gen->remaining)
+  if (size >= gen->remaining)
   {
       if (aggreg)
          gc->yng_lst = gen->next;
@@ -285,6 +314,9 @@ gc_gmc_get_free_object_of_size(Interp *i
   pmc_body = gen->fst_free;
   gen->fst_free = (void*)((char*)pmc_body + size);
   gen->remaining -= size;
+#ifdef GMC_DEBUG
+  fprintf (stderr,"Allocated size %d in gen %p, first: %p, remaining %d, 
next_gen: %p, fst_free: %p\n", size, gen, gen->first, gen->remaining, 
gen->next, gen->fst_free);
+#endif
 
 #ifdef GMC_DEBUG
   fprintf (stderr, "Allocating %s PMC of size %d\n", (aggreg) ? "aggregate" : 
"non-aggregate", size);
@@ -367,15 +399,15 @@ gc_gmc_copy_gen (Gc_gmc_gen *from, Gc_gm
     dest->fst_free = (void*)((char*)dest->first + offset);
     dest->remaining = from->remaining;
     dest->IGP = from->IGP;
+    fprintf (stderr, "Copying gen %p to gen %p\n", from, dest);
+    fprintf (stderr, "Copying %p to %p\n", from->first, dest->first);
     memcpy(dest->first, from->first, GMC_GEN_SIZE);
 }
 
 static void
 gc_gmc_gen_free(Gc_gmc_gen *gen)
 {
-    fprintf(stderr, "Freeing gen->first %p\n", gen->first);
     mem_sys_free(gen->first);
-    fprintf(stderr, "Freeing gen %p\n", gen);
     mem_sys_free(gen);
 }
 
@@ -401,6 +433,7 @@ gc_gmc_more_pmc_bodies (Interp *interpre
     dummy_gc->yng_lst = NULL;
     dummy_gc->old_fst = NULL;
     dummy_gc->old_lst = NULL;
+    dummy_gc->nb_gen = nb_gen;
     
     for (i = 0; i < nb_gen; i++)
     {
@@ -408,22 +441,23 @@ gc_gmc_more_pmc_bodies (Interp *interpre
        gc_gmc_insert_gen (interpreter, dummy_gc, gen);
     }
 
+    gc_gmc_test_linked_list_gen(interpreter, dummy_gc);
+
     for (gen = dummy_gc->yng_fst, ogen = gc->yng_fst; ogen; gen = gen->next)
     {
-       fprintf (stderr, "Old_gen: %p, old_gen->next: %p\n", ogen, ogen->next);
        ogen_nxt = ogen->next;
        gc_gmc_copy_gen(ogen,gen);
        gc_gmc_gen_free(ogen);
        ogen = ogen_nxt;
     }
     dummy_gc->yng_lst = gen;
-    fprintf(stderr, "First half\n");
 
     for (gen = dummy_gc->yng_fst, i = 0; i < (nb_gen/2); i++, gen = gen->next);
     dummy_gc->old_fst = gen;
     gen->prev->next = NULL;
     gen->prev = NULL;
 
+    fprintf (stderr, "ogen: %p\n", gc->old_fst);
     for (gen = dummy_gc->old_fst, ogen = gc->old_fst; ogen; gen = gen->next)
     {
        ogen_nxt = ogen->next;

Modified: branches/gmc/src/memory.c
==============================================================================
--- branches/gmc/src/memory.c   (original)
+++ branches/gmc/src/memory.c   Sun Aug 14 07:36:03 2005
@@ -154,11 +154,6 @@ mem_sys_free(void *from)
 #ifdef DETAIL_MEMORY_DEBUG
     printf("Freed %p\n", from);
 #endif
-    if (from == 0x082a91d0)
-    {
-       from = NULL;
-       *(int*)NULL = 54;
-    }
     free(from);
 }
 

Reply via email to