Пример #1
0
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);
    */
}
Пример #2
0
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);
}