Author: Whiteknight
Date: Tue Aug 12 18:29:11 2008
New Revision: 30199

Modified:
   branches/gsoc_pdd09/src/gc/gc_it.c
   branches/gsoc_pdd09/src/gc/smallobject.c

Log:
[gsoc_pdd09] added a spattering of diagnostics messages. Getting some 
rediculous errors and can't pin them down yet.

Modified: branches/gsoc_pdd09/src/gc/gc_it.c
==============================================================================
--- branches/gsoc_pdd09/src/gc/gc_it.c  (original)
+++ branches/gsoc_pdd09/src/gc/gc_it.c  Tue Aug 12 18:29:11 2008
@@ -593,9 +593,8 @@
                 PObj * pobj = IT_HDR_to_PObj(hdr);
                 if (PObj_needs_early_DOD_TEST(pobj))
                     --interp->arena_base->num_early_DOD_PMCs;
-                GC_IT_ADD_TO_FREE_LIST(pool, hdr);
+                gc_it_add_free_header(interp, pool, hdr);
                 Parrot_dod_free_pmc(interp, pool, IT_HDR_to_PObj(hdr));
-                gc_it_set_card_mark(hdr, GC_IT_CARD_FREE);
                 ++pool->num_free_objects;
             }
             else if (mark == GC_IT_CARD_BLACK) {
@@ -645,11 +644,12 @@
             mark = gc_it_get_card_mark(hdr);
             if (mark == GC_IT_CARD_WHITE) {
                 gc_it_add_free_header(interp, pool, hdr);
-                gc_it_set_card_mark(hdr, GC_IT_CARD_FREE);
                 ++pool->num_free_objects;
             }
-            else if (mark == GC_IT_CARD_BLACK)
+            else if (mark == GC_IT_CARD_BLACK) {
                 gc_it_set_card_mark(hdr, GC_IT_CARD_WHITE);
+                hdr->next = NULL;
+            }
             hdr = (Gc_it_hdr*)((char*)hdr + (pool->object_size));
             i--;
         }
@@ -908,6 +908,7 @@
     pool->alloc_objects   = gc_it_alloc_objects;
     pool->more_objects    = gc_it_more_objects;
     pool->free_list       = NULL;
+    pool->last_Arena      = NULL;
 
     /* Initially, arena allocations are relatively small. Let's not try to
        force a GC run until a few arena's are allocated. This should also
@@ -950,14 +951,17 @@
 gc_it_add_free_object(PARROT_INTERP, ARGMOD(struct Small_Object_Pool *pool),
     ARGMOD(void *to_add))
 {
-    Gc_it_hdr * const hdr = PObj_to_IT_HDR(to_add);
+    PObj * p = (PObj*)to_add;
+    Gc_it_hdr * const hdr = PObj_to_IT_HDR(p);
+    PARROT_ASSERT(IT_HDR_to_PObj(hdr) == p);
+    PARROT_ASSERT(contained_in_pool(pool, p));
     gc_it_add_free_header(interp, pool, hdr);
 }
 
 PARROT_INLINE
 void
 gc_it_add_free_header(SHIM_INTERP, ARGMOD(struct Small_Object_Pool * pool),
-    ARGMOD(struct Gc_it_hdr * hdr))
+    ARGMOD(Gc_it_hdr * hdr))
 {
     /* If the item is already on the free list, short-circuit and return. If
        it's in the queue, we can't free it or we lose all the free objects
@@ -968,7 +972,10 @@
 
 #  if GC_IT_DEBUG
     /* This check is costly but helpful. */
-    PARROT_ASSERT(contained_in_pool(pool, IT_HDR_to_PObj(hdr)));
+    {
+        const PObj * const p = IT_HDR_to_PObj(hdr);
+        PARROT_ASSERT(contained_in_pool(pool, p));
+    }
 #  endif
 
     ++pool->num_free_objects;
@@ -1100,6 +1107,8 @@
     new_arena->start_objects = (void *)(((char *)new_arena) + sizeof 
(Small_Object_Arena));
 
     /* insert new_arena in pool's arena linked list */
+    new_arena->next = NULL;
+    new_arena->prev = NULL;
     Parrot_append_arena_in_pool(interp, pool, new_arena,
         object_size * objects_per_alloc);
 
@@ -1147,6 +1156,8 @@
     Gc_it_hdr       *p        = (Gc_it_hdr *)new_arena->start_objects;
     const size_t     num_objs = new_arena->total_objects;
     register size_t  i;
+    PARROT_ASSERT(new_arena == pool->last_Arena);
+    PARROT_ASSERT(contained_in_pool(pool, p));
 
     /* Here, we loop over the entire arena, finding the various object
        headers and attaching them to the pool's free list. Each object
@@ -1159,11 +1170,8 @@
         Gc_it_hdr *next = (Gc_it_hdr *)((char*)p + pool->object_size);
 
         /* Add the current item to the free list */
-        p->next = (Gc_it_hdr *)pool->free_list;
-        pool->free_list = p;
-
-        gc_it_set_card_mark(p, GC_IT_CARD_FREE);
-
+        PARROT_ASSERT(contained_in_pool(pool, p));
+        gc_it_add_free_object(interp, pool, p);
         p->data.agg = 0;
         p = next;
     }

Modified: branches/gsoc_pdd09/src/gc/smallobject.c
==============================================================================
--- branches/gsoc_pdd09/src/gc/smallobject.c    (original)
+++ branches/gsoc_pdd09/src/gc/smallobject.c    Tue Aug 12 18:29:11 2008
@@ -98,8 +98,13 @@
         const ptrdiff_t ptr_diff =
             (ptrdiff_t)ptr - (ptrdiff_t)arena->start_objects;
 
+        fprintf(stderr, "ptr_diff: %d\n", ptr_diff);
         if (0 <= ptr_diff
+#  if PARROT_GC_IT
+                && ptr_diff < (ptrdiff_t)(arena->total_objects * 
pool->object_size)
+#  else
                 && ptr_diff < (ptrdiff_t)(arena->used * pool->object_size)
+#  endif
                 && ptr_diff % pool->object_size == 0)
             return 1;
     }

Reply via email to