Branch: Tag:

1996-03-28

1996-03-28 21:33:36 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

garbage collect rewritten

Rev: src/array.c:1.9
Rev: src/array.h:1.6
Rev: src/gc.c:1.2
Rev: src/gc.h:1.2
Rev: src/list.c:1.3
Rev: src/list.h:1.2
Rev: src/mapping.c:1.4
Rev: src/mapping.h:1.3
Rev: src/object.c:1.8
Rev: src/object.h:1.5
Rev: src/program.c:1.8
Rev: src/program.h:1.4
Rev: src/svalue.c:1.8

1303: Inside #if defined(GC2)
     #ifdef GC2    - void gc_check_program(struct program *p) + void gc_mark_program_as_referenced(struct program *p)   { -  if(p==gc_ptr) gc_refs++; -  if(p->flags & GC_MARK) return; -  p->flags |= GC_MARK; -  gc_check_svalues(p->constants, p->num_constants); +  if(gc_mark(p)) +  gc_mark_svalues(p->constants, p->num_constants);   }      void gc_check_all_programs()   { -  struct program *p, *next; -  for(p=first_program;p;p=next) +  struct program *p; +  for(p=first_program;p;p=p->next) +  gc_check_svalues(p->constants, p->num_constants); + } +  + void gc_mark_all_programs()   { -  if(!(p->flags & GC_MARK)) +  struct program *p; +  for(p=first_program;p;p=p->next) +  if(gc_is_referenced(p)) +  gc_mark_program_as_referenced(p); + } +  + void gc_free_all_unreferenced_programs()   { -  gc_ptr=p; -  gc_refs=0; +  struct program *p,*next;    -  gc_check_program(p); -  +  for(p=first_program;p;p=next) +  { +  if(gc_do_free(p)) +  {    p->refs++; -  -  if(gc_refs == p->refs) +     free_svalues(p->constants, p->num_constants, -1); -  +     next=p->next;    free_program(p);    }else{
1336: Inside #if defined(GC2)
   }   }    - void gc_clear_program_marks() - { -  struct program *p; -  -  for(p=first_program;p;p=p->next) p->flags &=~ GC_MARK; - } -  +    #endif /* GC2 */