added more nobug instrumentation
authorChristian Thaeter <ct@pipapo.org>
Wed, 17 Jan 2007 08:41:15 +0000 (09:41 +0100)
committerChristian Thaeter <ct@pipapo.org>
Wed, 17 Jan 2007 08:41:15 +0000 (09:41 +0100)
lib/acogc.c
lib/acogc.h

index e18eb3c..b371ccf 100644 (file)
@@ -46,7 +46,8 @@ void
 acogc_root_init (AcogcRoot self)
 {
   REQUIRE (self);
-  INFO (acogc, "self %p", self);
+  NOTICE (acogc, "self %p", self);
+
   llist_init (&self->factories);
   self->allocation_counter = 0;
   self->collection_freq = 32;
@@ -62,6 +63,8 @@ void
 acogc_root_erase (AcogcRoot self)
 {
   REQUIRE (self);
+  NOTICE (acogc, "self %p", self);
+
   LLIST_FOREACH (&self->factories, fnode)
     {
       AcogcFactory f = LLIST_TO_STRUCTP (fnode, acogc_factory, factories);
@@ -109,7 +112,7 @@ void
 acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
 {
   REQUIRE (self);
-  NOTICE (acogc_collect, "start collection %p", self);
+  NOTICE (acogc_collect, "self %p, policy %d", self, pol);
 
   /* 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_USER1 || pol == ACOGC_COLLECT_DONTFREE)
@@ -152,6 +155,7 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
               ++f->objects_used;
             }
         }
+
       // and for all root->stack references
       for (AcogcStack r = self->stack; r; r = r->prev)
         {
@@ -226,7 +230,7 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
         {
           ++freed_objects;
 
-          NOTICE (acogc_collect, "free rate: %lu", f->objects_used * 100 / f->objects_allocated);
+          INFO (acogc_collect, "free rate: %lu", f->objects_used * 100 / f->objects_allocated);
           AcogcObject tmp = LLIST_TO_STRUCTP (llist_get_head (&f->dead), acogc_object, node);
 
           TRACE_DBG (acogc_collect, "freeing %p", acogc_memory_from_object (tmp));
@@ -240,11 +244,14 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
           acogc_free (&tmp);
           --f->objects_allocated;
         }
-      NOTICE (acogc_collect, "allocated %lu, used %lu, ", f->objects_allocated,f->objects_used);
+      NOTICE (acogc_collect, "after freeing: allocated %lu, used %lu, ", f->objects_allocated,f->objects_used);
     }
 
   if (freed_objects > 16)
-    self->collection_freq = self->collection_freq * (had_objects-freed_objects) / had_objects +1;
+    {
+      self->collection_freq = (self->collection_freq * (had_objects-freed_objects) / had_objects)/2 +1;
+      TRACE (acogc_collect, "decreased collection freq: %lu", self->collection_freq);
+    }
 
   NOTICE_DBG (acogc_collect, "collection complete");
 }
@@ -271,7 +278,7 @@ acogc_factory_init (AcogcFactory self,
   REQUIRE (high_water < 100);
   REQUIRE (low_water <= high_water);
 
-  NOTICE_DBG (acogc, "%p", self);
+  NOTICE (acogc, "self %p", self);
 
   llist_init (&self->factories);
   llist_insert_tail (&root->factories, &self->factories);
@@ -302,7 +309,7 @@ acogc_factory_alloc (AcogcFactory self)
   REQUIRE (self);
   AcogcObject object;
 
-  INFO (acogc_alloc, "%s allocated: %lu", self->factory_name, self->objects_allocated);
+  INFO (acogc_alloc);
 
   ++self->root->allocation_counter;
 
@@ -316,6 +323,7 @@ acogc_factory_alloc (AcogcFactory self)
         {
           // collected less than low_water, increase collection_freq and allocate
           self->root->collection_freq = self->root->collection_freq*3/2 +1;
+          TRACE (acogc_collect, "increased collection freq: %lu", self->root->collection_freq);
           goto allocate;
         }
     }
@@ -368,13 +376,16 @@ acogc_factory_alloc (AcogcFactory self)
 acogc_mark_result
 acogc_object_markreally (AcogcObject self)
 {
+  REQUIRE (self);
+
  tailcall:
-  TRACE_DBG (acogc_mark, "mark object %p, state %d", acogc_memory_from_object (self), self->state);
+  TRACE (acogc_mark, "mark object %p, state %d", acogc_memory_from_object (self), self->state);
 
   REQUIRE (self->state != self->factory->root->state, "marking already marked object %p", acogc_memory_from_object (self));
 
   if (!self->factory->mark || self->factory->mark (acogc_memory_from_object (self)) == ACOGC_KEEP)
     {
+      TRACE_DBG (acogc_mark, "keep object %p", acogc_memory_from_object (self));
       if (self->state >= ACOGC_STATE_BUSY)
         {
           /* is a dynamically allocated object */
@@ -389,6 +400,7 @@ acogc_object_markreally (AcogcObject self)
         {
           self = self->factory->root->last;
           self->factory->root->last = NULL;
+          TRACE (acogc_mark, "tailcall");
           goto tailcall;
         }
       return ACOGC_KEEP;
@@ -401,7 +413,7 @@ void
 acogc_addroot (void* object)
 {
   REQUIRE (object);
-  NOTICE_DBG (acogc, "object %p", object);
+  TRACE (acogc, "object: %p", object);
   //if(!object)
   //  return;
 
@@ -411,6 +423,7 @@ acogc_addroot (void* object)
     {
       /* nested addroot */
       --o->state;
+      INFO_DBG (acogc, "object: %p already root, nested %d", object, -o->state);
     }
   else
     {
@@ -426,29 +439,32 @@ acogc_removeroot (void* object)
 {
   REQUIRE (object);
 
-  NOTICE_DBG (acogc, "object %p", object);
+  TRACE (acogc, "object: %p", object);
   //if(!object)
   //  return;
 
   AcogcObject o = acogc_object_from_memory (object);
 
   if (o->state < ACOGC_STATE_ROOT)
-    /* dynamic object, nested */
-    ++o->state;
+    {
+      /* dynamic object, nested */
+      ++o->state;
+      INFO_DBG (acogc, "object: %p still root, nested %d", object, -o->state);
+    }
   else
     {
       AcogcFactory factory = o->factory;
       if (o->state == ACOGC_STATE_ROOT)
         {
           /* dynamic object, removeroot */
-          TRACE_DBG (acogc, " ..dynamic");
+          TRACE_DBG (acogc, " ..dynamic, removed from root");
           llist_insert_tail (&factory->alive, &o->node);
           o->state = factory->root->state;
         }
       else
         {
           /* uncollectable object */
-          TRACE_DBG (acogc, " ..uncollectable");
+          TRACE_DBG (acogc, " ..uncollectable, removed from root");
           if (o->state == ACOGC_STATE_UNCOLLECTABLE && factory->finalize)
             factory->finalize (object);
 
@@ -472,11 +488,16 @@ acogc_weakref_link (AcogcWeakref self, void* o)
   REQUIRE (self);
   REQUIRE (o);
 
+  TRACE (acogc_weak, "%p to %p", self, o);
+
   if (self->ref != o)
     {
-      TRACE_DBG (acogc_weak, "weaklink %p to %p", self, o);
+      NOTICE (acogc_weak, "already linked together");
       if(self->next)
-        acogc_weakref_unlink (self);
+        {
+          NOTICE (acogc_weak, "weakref linked to another object");
+          acogc_weakref_unlink (self);
+        }
 
       self->ref = o;
 
@@ -492,6 +513,8 @@ acogc_weakref_unlink (AcogcWeakref self)
 {
   REQUIRE (self);
 
+  TRACE (acogc_weak, "%p", self);
+
   AcogcWeakref_ref prev = &self->next;
   AcogcWeakref i = self->next;
   if (i)
@@ -517,8 +540,8 @@ void
 acogc_object_weakref_invalidate (void* memory)
 {
   REQUIRE (memory);
+  TRACE (acogc_weak, "%p, weak %p", memory, acogc_object_from_memory(memory)->weakrefs);
 
-  INFO_DBG (acogc_weak, "invalidate %p, weak %p", memory, acogc_object_from_memory(memory)->weakrefs);
   AcogcWeakref_ref object = &acogc_object_from_memory(memory)->weakrefs;
   if (*object)
     {
@@ -538,6 +561,7 @@ void *
 acogc_weakref_reinstget (AcogcWeakref self)
 {
   REQUIRE (self);
+  TRACE (acogc_weak, "%p", self);
 
   if (!self->ref)
     {
@@ -561,6 +585,7 @@ void *
 acogc_weakref_get (AcogcWeakref self)
 {
   REQUIRE (self);
+  TRACE (acogc_weak, "%p", self);
 
   if (!self->ref)
     return NULL;
@@ -568,7 +593,12 @@ acogc_weakref_get (AcogcWeakref self)
   AcogcObject o = acogc_object_from_memory (self->ref);
 
   if (o->state >= ACOGC_STATE_FIRST && o->state < o->factory->root->state)
-    return NULL;
+    {
+      INFO_DBG (acogc_weak, "already invalidated");
+      return NULL;
+    }
+
+  INFO_DBG (acogc_weak, "resolved %p", self->ref);
 
   return self->ref;
 }
@@ -587,6 +617,7 @@ acogc_alloc_ (void ** addr, size_t size, AcogcRoot root)
 {
   REQUIRE (addr);
   REQUIRE (size > 0);
+  TRACE (acogc_alloc);
 
   void * ret;
   acogc_freeing_policy pol = ACOGC_COLLECT_NORMAL;
@@ -620,6 +651,7 @@ acogc_reserve_ (void ** addr, size_t actual, size_t needed, AcogcRoot root)
   REQUIRE (addr);
   REQUIRE (actual > 0);
   REQUIRE (needed > 0);
+  TRACE (acogc_alloc);
 
   void * ret;
   acogc_freeing_policy pol = ACOGC_COLLECT_NORMAL;
@@ -656,6 +688,7 @@ void
 acogc_free_ (void ** addr)
 {
   REQUIRE (addr);
+  TRACE (acogc_alloc);
   free (*addr);
   *addr = NULL;
 }
index b865c23..c498dbc 100644 (file)
@@ -324,10 +324,10 @@ acogc_object_markreally (AcogcObject object);
 static inline acogc_mark_result
 acogc_object_mark (void * o)
 {
+  TRACE(acogc_mark, "%p", o);
+
   if (o)
     {
-      INFO (acogc_mark, "object %p", o);
-
       AcogcObject object = acogc_object_from_memory (o);
 
       TRACE_DBG (acogc_mark, "state %d", object->state);
@@ -350,6 +350,8 @@ acogc_object_mark (void * o)
 static inline acogc_mark_result
 acogc_object_lastmark (void * o)
 {
+  TRACE(acogc_mark, "lastmark %p", o);
+
   if (o)
     {
       INFO (acogc_mark, "object %p", o);