debug improvement
authorChristian Thaeter <ct@pipapo.org>
Sat, 6 Jan 2007 08:59:03 +0000 (09:59 +0100)
committerChristian Thaeter <ct@pipapo.org>
Sat, 6 Jan 2007 08:59:03 +0000 (09:59 +0100)
lib/acogc.c
lib/acogc.h

index 0af035f..c415784 100644 (file)
@@ -110,13 +110,15 @@ void
 acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
 {
   REQUIRE (self);
+  NOTICE (acogc_collect, "start collection %p", self);
+
   /* we can short-circruit the collection we just did one and no user-code has been run */
   if (self->allocation_counter != 0 || pol >= ACOGC_COLLECT_FORCEALL || pol == ACOGC_COLLECT_DONTFREE)
     {
       /* calculate new average and reset stat */
       self->collection_freq_avg = (self->collection_freq_avg + self->allocation_counter) / 2 + 1; 
       self->allocation_counter = 0;
-      NOTICE_DBG (acogc_collect, "start collection %p, collection_freq %lu", self, self->collection_freq_avg);
+      NOTICE (acogc_collect, "start collection %p, collection_freq %lu", self, self->collection_freq_avg);
 
       /* move all previous alive objects to the tmp lists */
       LLIST_FOREACH (&self->factories, fnode)
@@ -163,6 +165,7 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
       LLIST_FOREACH (&self->factories, fnode)
         {
           AcogcFactory f = LLIST_TO_STRUCTP (fnode, acogc_factory, factories);
+          NOTICE (acogc_collect, "collected %d objects", llist_count (&f->tmp));
           llist_insert_list_before (&f->tmp, &f->dead);
         }
     }
@@ -216,8 +219,10 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
           ; /*unreached*/
         }
 
-      while (!llist_is_empty (&f->dead) && f->objects_allocated &&
-             (f->was_free = 100 - (f->objects_used * 100 / f->objects_allocated)) > free_limit)
+      f->was_free = f->objects_allocated?100 - (f->objects_used * 100 / f->objects_allocated):0;
+      NOTICE (acogc_collect, "was free: %d", f->was_free);
+
+      while (!llist_is_empty (&f->dead) && f->objects_allocated && f->was_free > free_limit)
         {
           AcogcObject tmp = LLIST_TO_STRUCTP (llist_get_head (&f->dead), acogc_object, node);
 
@@ -279,6 +284,7 @@ acogc_factory_init (AcogcFactory self,
   self->mark = mark;
   self->initize = initize;
   self->finalize = finalize;
+  self->factory_name = NULL;
 }
 
 
@@ -288,7 +294,7 @@ acogc_factory_alloc (AcogcFactory self)
   REQUIRE (self);
   AcogcObject object;
 
-  INFO_DBG (acogc_alloc, "%p", self);
+  INFO (acogc_alloc, "%s allocated: %lu in-use: %lu", self->factory_name, self->objects_allocated, self->objects_used);
 
   ++self->root->allocation_counter;
 
index b9ca2ce..fe899da 100644 (file)
@@ -153,7 +153,7 @@ typedef enum
 
 typedef enum
   {
-    // first states are not GC controlled and memory tagged with thme has no gc descriptor
+    // first states are not GC controlled and memory tagged with them has no gc descriptor
     ACOGC_UNSET,        /* undefined */
     ACOGC_ALLOC,        /* malloc/free acogoc_alloc/acogc_free */
     // next states for memory with gc descriptor
@@ -181,7 +181,7 @@ struct acogc_root_struct
 {
   llist factories;
 
-  int state;                             /* actually a counter, 0 is reserved for root objects */
+  int state;                            /* actually a counter, 0 is reserved for root objects */
 
   AcogcStack stack;
 
@@ -234,7 +234,7 @@ struct acogc_factory_struct
   llist dead;                           /* unused objects (might still be referenced by weak pointers and reinstantiated on demand) */
   llist tmp;                            /* temporary list for collection */
 
-  unsigned long objects_allocated;      /* number of allocated objects */
+  unsigned long objects_allocated;      /* grand number of allocated objects */
   unsigned long objects_used;           /* number of objects in use at the last collection + freshly allocated objects */
 
   unsigned was_free;                    /* percent of free objects at the last collection */
@@ -247,6 +247,8 @@ struct acogc_factory_struct
   acogc_mark_func mark;                 /* marker function */
   acogc_initize_func initize;           /* initizer for NULL'ing referencess */
   acogc_finalize_func finalize;         /* finalizer called before a object is free()'ed */
+
+  const char* factory_name;             /* only for debugging purpose */
 };
 
 /*