Branch: Tag:

1997-01-28

1997-01-28 03:02:08 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

more debug added, gc_callback added

Rev: src/gc.c:1.7
Rev: src/gc.h:1.6

15:   #include "mapping.h"   #include "object.h"   #include "program.h" + #include "stralloc.h"      #include "gc.h"   #include "main.h"
37:   static double objects_alloced;   static double objects_freed;    + struct callback_list gc_callbacks; +  + struct callback *add_gc_callback(callback_func call, +  void *arg, +  callback_func free_func) + { +  return add_to_callback(&gc_callbacks, call, arg, free_func); + } +    #define GC_REFERENCED 1      struct marker
104:   }   #endif    - void gc_check(void *a) + INT32 gc_check(void *a)   {   #ifdef DEBUG    if(check_for)
113: Inside #if defined(DEBUG)
   {    gdb_gc_stop_here(a);    } -  return; +  return 0;    }   #endif -  getmark(a)->refs++; +  return getmark(a)->refs++;   }      int gc_is_referenced(void *a)
133: Inside #if defined(DEBUG)
   gc_check_all_mappings();    gc_check_all_programs();    gc_check_all_objects(); +  call_callback(& gc_callbacks, (void *)0);       check_for=0;    fatal("Ref counts are totally wrong!!!\n");
235:    * num_objects/4, this will assure that no re-hashing is needed.    */    hashsize=my_log2(num_objects); -  hashsize-=2; +  +  if(!d_flag) hashsize-=2; +     if(hashsize<0) hashsize=0;    hashsize=hashprimes[hashsize];    hash=(struct marker **)xalloc(sizeof(struct marker **)*hashsize);
247:    gc_check_all_mappings();    gc_check_all_programs();    gc_check_all_objects(); +  call_callback(& gc_callbacks, (void *)0);       gc_mark_all_arrays();    gc_mark_all_multisets();
254:    gc_mark_all_programs();    gc_mark_all_objects();    +  if(d_flag) +  gc_mark_all_strings(); +     gc_free_all_unreferenced_arrays();    gc_free_all_unreferenced_multisets();    gc_free_all_unreferenced_mappings();