added nobug check for stack corruption release0.1 release0.1_signature
authorChristian Thaeter <ct@pipapo.org>
Wed, 17 Jan 2007 09:43:10 +0000 (10:43 +0100)
committerChristian Thaeter <ct@pipapo.org>
Wed, 17 Jan 2007 09:43:10 +0000 (10:43 +0100)
lib/acogc.c

index b371ccf..6d82a70 100644 (file)
@@ -127,9 +127,10 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
         }
 
       ++self->state;
-      // check for state overflow and reinit GC states (happens *very* rarely)
+      // check for state overflow and reinit GC states (happens *very* rarely, once every 2^31 collections at worst)
       if (self->state == ACOGC_STATE_LAST)
         {
+          NOTICE (acogc_collect, "gc state overflow, recycle");
           self->state = ACOGC_STATE_START;
           LLIST_FOREACH (&self->factories, fnode)
             {
@@ -145,6 +146,7 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
       LLIST_FOREACH (&self->factories, fnode)
         {
           AcogcFactory f = LLIST_TO_STRUCTP (fnode, acogc_factory, factories);
+          TRACE (acogc_collect, "marking roots in %s", f->factory_name);
           f->objects_used = 0;
           f->objects_new = 0;
           LLIST_FOREACH (&f->roots, i)
@@ -157,8 +159,10 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
         }
 
       // and for all root->stack references
+      TRACE (acogc_collect, "marking stack references");
       for (AcogcStack r = self->stack; r; r = r->prev)
         {
+          ASSERT (r != r->prev, "stack corruption, maybe ACOGC_STACK_PTR redefinition in a loop");
           TRACE_DBG (acogc_collect, "stack marker %p", r->ptr);
           acogc_object_mark (r->ptr);
         }