void gc_collect(pobject env) { int collected = 0; /* int old_count = gc_objects; */ pobject prev, cur, object; /* set gc flag of all gc_list objects to 0 */ cur = gc_list; while (cur) { gc_flag_set(cons_car(cur), 0); cur = cons_cdr(cur); } /* traverse environment and set gc flag of all objects to 1 */ gc_traverse(env); /* go through gc_list a second time and free all all objects * with flag 0 */ prev = NIL; cur = gc_list; while (cur) { object = cons_car(cur); if (gc_flag_get(object) == 0) { gc_free(object); collected++; if (prev) { cons_cdr_set(prev, cons_cdr(cur)); object_free(cur); cur = cons_cdr(prev); } else { gc_list = cons_cdr(cur); object_free(cur); cur = gc_list; } } else { prev = cur; cur = cons_cdr(cur); } } /* printf("\ngc_collect: %d of %d objects collected\n", collected, old_count); */ }
void gc_free(pobject object) { pobject prev = NIL, cur; /* look for the cons cell in gc_list for object */ cur = gc_list; while (cur) { if (cons_car(cur) == object) break; prev = cur; cur = cons_cdr(cur); } /* set new gc_list connections and free the cur cons cell */ if (cur) { if (prev) cons_cdr_set(prev, cons_cdr(cur)); else gc_list = cons_cdr(cur); object_free(cur); } object_free(object); }