new NOBUG integration
authorChristian Thaeter <ct@pipapo.org>
Wed, 20 Dec 2006 01:02:36 +0000 (02:02 +0100)
committerChristian Thaeter <ct@pipapo.org>
Wed, 20 Dec 2006 01:02:36 +0000 (02:02 +0100)
configure.ac
lib/acogc.c
lib/acogc.h
tests/test-acogc.c

index 6619bd6..d8a1bed 100644 (file)
@@ -29,7 +29,6 @@ AC_PROG_RANLIB
 
 AC_DEFINE(EBUG_ALPHA)
 
-AC_DEFINE(NOBUG_NAMESPACE,ACOGC)
 AC_CHECK_HEADER(nobug.h, break, AC_MSG_ERROR(nobug.h required))
 
 dnl TODO install supplied llist.h if not available
index 8b64b14..b65177e 100644 (file)
 #include "acogc.h"
 // TODO collection statistics (timing, global counter, etc)
 
+/* nobug init*/
+NOBUG_DEFINE_FLAG(acogc);
+NOBUG_DEFINE_FLAG(acogc_mark);
+NOBUG_DEFINE_FLAG(acogc_collect);
+NOBUG_DEFINE_FLAG(acogc_alloc);
+NOBUG_DEFINE_FLAG(acogc_weak);
+
+void acogc_nobug_init()
+{
+  NOBUG_INIT_FLAG(acogc);
+  NOBUG_INIT_FLAG(acogc_mark);
+  NOBUG_INIT_FLAG(acogc_collect);
+  NOBUG_INIT_FLAG(acogc_alloc);
+  NOBUG_INIT_FLAG(acogc_weak);
+}
+
 /*
   root
 */
 void
 acogc_root_init (AcogcRoot self)
 {
-  LOG_DBG (NOBUG_INFO, "self %p", self);
+  INFO (acogc, "self %p", self);
   llist_init (&self->factories);
   self->collection_freq_avg = 0;
   self->allocation_counter = 0;
@@ -55,7 +71,7 @@ acogc_root_erase (AcogcRoot self)
       LLIST_WHILE_HEAD (&f->dead, i)
         {
           AcogcObject tmp = LLIST_TO_STRUCTP (i, acogc_object, node);
-          LOG_DBG (NOBUG_DEBUG, "erasing from dead %p", acogc_memory_from_object(tmp));
+          TRACE_DBG (acogc, "erasing from dead %p", acogc_memory_from_object(tmp));
           if (tmp->factory->finalize)
             tmp->factory->finalize (acogc_memory_from_object (tmp));
           acogc_object_weakref_invalidate (acogc_memory_from_object (tmp));
@@ -67,7 +83,7 @@ acogc_root_erase (AcogcRoot self)
       LLIST_WHILE_HEAD (&f->alive, i)
         {
           AcogcObject tmp = LLIST_TO_STRUCTP (i, acogc_object, node);
-          LOG_DBG (NOBUG_DEBUG, "erasing from alive %p", acogc_memory_from_object(tmp));
+          TRACE_DBG (acogc, "erasing from alive %p", acogc_memory_from_object(tmp));
           if (tmp->factory->finalize)
             tmp->factory->finalize (acogc_memory_from_object (tmp));
           acogc_object_weakref_invalidate (acogc_memory_from_object (tmp));
@@ -97,7 +113,7 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
       /* calculate new average and reset stat */
       self->collection_freq_avg = (self->collection_freq_avg + self->allocation_counter) / 2 + 1; 
       self->allocation_counter = 0;
-      LOG_DBG (NOBUG_NOTICE, "start collection %p, collection_freq %lu", self, self->collection_freq_avg);
+      NOTICE_DBG (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)
@@ -128,7 +144,7 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
           f->objects_used = 0;
           LLIST_FOREACH (&f->roots, i)
             {
-              LOG_DBG (NOBUG_DEBUG, "root marker %p",
+              TRACE_DBG (acogc_collect, "root marker %p",
                        acogc_memory_from_object (LLIST_TO_STRUCTP (i, acogc_object, node)));
               acogc_object_markreally (LLIST_TO_STRUCTP (i, acogc_object, node));
             }
@@ -136,7 +152,7 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
       // and for all root->stack references
       for (AcogcStack r = self->stack; r; r = r->prev)
         {
-          LOG_DBG (NOBUG_DEBUG, "stack marker %p", r->ptr);
+          TRACE_DBG (acogc_collect, "stack marker %p", r->ptr);
           acogc_object_mark (r->ptr);
         }
 
@@ -202,7 +218,7 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
         {
           AcogcObject tmp = LLIST_TO_STRUCTP (llist_get_head (&f->dead), acogc_object, node);
 
-          LOG_DBG (NOBUG_DEBUG, "freeing %p", acogc_memory_from_object (tmp));
+          TRACE_DBG (acogc_collect, "freeing %p", acogc_memory_from_object (tmp));
 
           if (tmp->factory->finalize)
             tmp->factory->finalize (acogc_memory_from_object (tmp));
@@ -215,7 +231,7 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
         }
     }
 
-  LOG_DBG (NOBUG_NOTICE, "collection complete");
+  NOTICE_DBG (acogc_collect, "collection complete");
 }
 
 
@@ -232,7 +248,7 @@ acogc_factory_init (AcogcFactory self,
                     acogc_initize_func initize,
                     acogc_finalize_func finalize)
 {
-  LOG_DBG (NOBUG_NOTICE, "%p", self);
+  NOTICE_DBG (acogc, "%p", self);
 
   llist_init (&self->factories);
   llist_insert_tail (&root->factories, &self->factories);
@@ -260,7 +276,7 @@ acogc_factory_alloc (AcogcFactory self)
 {
   AcogcObject object;
 
-  LOG_DBG (NOBUG_DEBUG, "self %p", self);
+  INFO_DBG (acogc_alloc, "%p", self);
 
   ++self->root->allocation_counter;
 
@@ -284,7 +300,7 @@ acogc_factory_alloc (AcogcFactory self)
       llist_insert_tail (&self->alive, &object->node);
 
       ++self->objects_allocated;
-      LOG_DBG (NOBUG_DEBUG, "from malloc %p", acogc_memory_from_object (object));
+      TRACE_DBG (acogc_alloc, "from malloc %p", acogc_memory_from_object (object));
     }
   else
     {
@@ -298,7 +314,7 @@ acogc_factory_alloc (AcogcFactory self)
 
       acogc_object_weakref_invalidate (acogc_memory_from_object (object));
 
-      LOG_DBG (NOBUG_DEBUG, "from freelist %p", acogc_memory_from_object (object));
+      TRACE_DBG (acogc_alloc, "from freelist %p", acogc_memory_from_object (object));
     }
 
   if (self->initize)
@@ -321,7 +337,7 @@ acogc_mark_result
 acogc_object_markreally (AcogcObject self)
 {
  tailcall:
-  LOG_DBG (NOBUG_DEBUG, "mark object %p, state %d", acogc_memory_from_object (self), self->state);
+  TRACE_DBG (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));
 
@@ -353,7 +369,7 @@ acogc_object_markreally (AcogcObject self)
 void
 acogc_addroot (void* object)
 {
-  LOG_DBG (NOBUG_INFO, "object %p", object);
+  NOTICE_DBG (acogc, "object %p", object);
   if(!object)
     return;
 
@@ -376,7 +392,7 @@ acogc_addroot (void* object)
 void
 acogc_removeroot (void* object)
 {
-  LOG_DBG (NOBUG_INFO, "object %p", object);
+  NOTICE_DBG (acogc, "object %p", object);
   if(!object)
     return;
 
@@ -391,14 +407,14 @@ acogc_removeroot (void* object)
       if (o->state == ACOGC_STATE_ROOT)
         {
           /* dynamic object, removeroot */
-          LOG_DBG (NOBUG_DEBUG, "dynamic");
+          TRACE_DBG (acogc, " ..dynamic");
           llist_insert_tail (&factory->alive, &o->node);
           o->state = factory->root->state;
         }
       else
         {
           /* uncollectable object */
-          LOG_DBG (NOBUG_DEBUG, "uncollectable");
+          TRACE_DBG (acogc, " ..uncollectable");
           if (o->state == ACOGC_STATE_UNCOLLECTABLE && factory->finalize)
             factory->finalize (object);
 
@@ -421,7 +437,7 @@ acogc_weakref_link (AcogcWeakref self, void* o)
 {
   if (self->ref != o)
     {
-      LOG_DBG (NOBUG_DEBUG, "weaklink %p to %p", self, o);
+      TRACE_DBG (acogc_weak, "weaklink %p to %p", self, o);
       if(self->next)
         acogc_weakref_unlink (self);
 
@@ -447,7 +463,7 @@ acogc_weakref_unlink (AcogcWeakref self)
           prev = &i->next;
           i = i->next;
         }
-      LOG_DBG (NOBUG_DEBUG, "unlink %p from after %p, before %p", self, prev, self->next);
+      TRACE_DBG (acogc_weak, "unlink %p from after %p, before %p", self, prev, self->next);
       *prev = self->next;
       self->ref = NULL;
       self->next = NULL;
@@ -461,14 +477,14 @@ acogc_weakref_unlink (AcogcWeakref self)
 void
 acogc_object_weakref_invalidate (void* memory)
 {
-  LOG_DBG (NOBUG_INFO, "invalidate %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)
     {
       while ((*object)->next != *object)
         {
           AcogcWeakref tmp = *object;
-          LOG_DBG (NOBUG_DEBUG, "invalidate %p, ref %p", tmp, tmp->ref);
+          TRACE_DBG (acogc_weak, "invalidate %p, ref %p", tmp, tmp->ref);
           (*object) = (*object)->next;
           tmp->ref = NULL;
           tmp->next = NULL;
@@ -481,12 +497,16 @@ void *
 acogc_weakref_reinstget (AcogcWeakref self)
 {
   if (!self->ref)
-    return NULL;
+    {
+      TRACE_DBG (acogc_weak, "reinst miss %p", self);
+      return NULL;
+    }
 
   AcogcObject o = acogc_object_from_memory (self->ref);
 
   if (o->state >= ACOGC_STATE_START && o->state < o->factory->root->state)
     {
+      TRACE_DBG (acogc_weak, "reinst hit %p, object %p", self, self->ref);
       o->state = o->factory->root->state;
       llist_insert_tail (&o->factory->alive, &o->node);
       ++o->factory->objects_used;
index 8f1cb95..cfacd02 100644 (file)
@@ -35,6 +35,13 @@ cooperative
 
 #include "llist.h"
 
+NOBUG_DECLARE_FLAG(acogc);
+NOBUG_DECLARE_FLAG(acogc_mark);
+NOBUG_DECLARE_FLAG(acogc_collect);
+NOBUG_DECLARE_FLAG(acogc_alloc);
+NOBUG_DECLARE_FLAG(acogc_weak);
+
+
 /*
   object types and handles
 */
@@ -146,10 +153,10 @@ 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 thme has no gc descriptor
     ACOGC_UNSET,        /* undefined */
     ACOGC_ALLOC,        /* malloc/free acogoc_alloc/acogc_free */
-    // next states for memory with gc descriptor
+    // next states for memory with gc descriptor
     ACOGC_STATIC,       /* non freeable */
     ACOGC_GC,           /* garbage collected */
   } acogc_alloc_type;
@@ -161,6 +168,9 @@ typedef void (*acogc_initize_func)(void*);
 typedef void (*acogc_finalize_func)(void*);
 typedef acogc_mark_result (*acogc_mark_func)(void*);
 
+/* nobug init */
+void acogc_nobug_init();
+
 /*
   root
 
@@ -309,16 +319,16 @@ acogc_object_type (const void * o)
 static inline acogc_mark_result
 acogc_object_mark (void * o)
 {
-  LOG_DBG (NOBUG_INFO, "object %p", o);
+  INFO (acogc_mark, "object %p", o);
 
   if (o)
     {
       AcogcObject object = acogc_object_from_memory (o);
 
-      LOG_DBG (NOBUG_DEBUG, "state %d", object->state);
-      LOG_DBG (NOBUG_DEBUG, "factory %p", object->factory);
-      LOG_DBG (NOBUG_DEBUG, "factory->root %p", object->factory->root);
-      LOG_DBG (NOBUG_DEBUG, "factory->root->state %d", object->factory->root->state);
+      TRACE_DBG (acogc_mark, "state %d", object->state);
+      TRACE_DBG (acogc_mark, "factory %p", object->factory);
+      TRACE_DBG (acogc_mark, "factory->root %p", object->factory->root);
+      TRACE_DBG (acogc_mark, "factory->root->state %d", object->factory->root->state);
 
       if (object->state >= ACOGC_STATE_FIRST && object->state < object->factory->root->state)
         {
@@ -334,16 +344,16 @@ acogc_object_mark (void * o)
 static inline acogc_mark_result
 acogc_object_lastmark (void * o)
 {
-  LOG_DBG (NOBUG_INFO, "object %p", o);
+  INFO (acogc_mark, "object %p", o);
 
   if (o)
     {
       AcogcObject object = acogc_object_from_memory (o);
 
-      LOG_DBG (NOBUG_DEBUG, "state %d", object->state);
-      LOG_DBG (NOBUG_DEBUG, "factory %p", object->factory);
-      LOG_DBG (NOBUG_DEBUG, "factory->root %p", object->factory->root);
-      LOG_DBG (NOBUG_DEBUG, "factory->root->state %d", object->factory->root->state);
+      TRACE_DBG (acogc_mark, "state %d", object->state);
+      TRACE_DBG (acogc_mark, "factory %p", object->factory);
+      TRACE_DBG (acogc_mark, "factory->root %p", object->factory->root);
+      TRACE_DBG (acogc_mark, "factory->root->state %d", object->factory->root->state);
 
       if (object->state >= ACOGC_STATE_FIRST && object->state < object->factory->root->state)
         {
index 8f950ff..2095e78 100644 (file)
@@ -24,6 +24,8 @@
 
 #include "../lib/acogc.h"
 
+NOBUG_DEFINE_FLAG(test);
+
 struct object
 {
   int notused;
@@ -82,6 +84,10 @@ int main(int argc, char* argv[])
   struct object* obj1;
   struct object* obj2;
 
+  acogc_nobug_init();
+
+  NOBUG_FLAG(test) = 1;
+
   if (argc != 2)
     {
       printf("ERROR\n");
@@ -105,21 +111,21 @@ int main(int argc, char* argv[])
       init ();
       obj = acogc_factory_alloc (&gcfactory);
       acogc_addroot (obj);
-      LOG (NOBUG_NOTICE, "allocated %p", obj);
+      NOTICE (test, "allocated %p", obj);
 
       obj2 = acogc_factory_alloc (&gcfactory);
       obj->ptra = obj2;
-      LOG (NOBUG_NOTICE, "allocated %p", obj2);
+      NOTICE (test, "allocated %p", obj2);
 
       for (int j = 0; j < 1000; ++j)
         {
           obj1 = acogc_factory_alloc (&gcfactory);
           obj2->ptra = obj1;
-          LOG (NOBUG_NOTICE, "allocated %p", obj1);
+          NOTICE (test, "allocated %p", obj1);
 
           obj2 = acogc_factory_alloc (&gcfactory);
           obj1->ptra = obj2;
-          LOG (NOBUG_NOTICE, "allocated %p", obj2);
+          NOTICE (test, "allocated %p", obj2);
         }
       acogc_removeroot (obj);
 
@@ -131,12 +137,12 @@ int main(int argc, char* argv[])
       init ();
       obj = acogc_factory_alloc (&gcfactory);
       acogc_addroot (obj);
-      LOG (NOBUG_NOTICE, "allocated %p", obj);
+      NOTICE (test, "allocated %p", obj);
 
       obj2 = acogc_factory_alloc (&gcfactory);
       acogc_addroot (obj2);
       obj->ptra = obj2;
-      LOG (NOBUG_NOTICE, "allocated %p", obj2);
+      NOTICE (test, "allocated %p", obj2);
 
       for (int j = 0; j < 1000; ++j)
         {
@@ -149,7 +155,7 @@ int main(int argc, char* argv[])
           acogc_removeroot (obj2);
           if (rand()%2)
             obj->ptra = obj1;
-          LOG (NOBUG_NOTICE, "allocated %p", obj1);
+          NOTICE (test, "allocated %p", obj1);
 
           obj2 = acogc_factory_alloc (&gcfactory);
           acogc_addroot (obj2);
@@ -160,7 +166,7 @@ int main(int argc, char* argv[])
           acogc_removeroot (obj1);
           if (rand()%2)
             obj->ptrb = obj2;
-          LOG (NOBUG_NOTICE, "allocated %p", obj2);
+          NOTICE (test, "allocated %p", obj2);
         }
       acogc_removeroot (obj);