next up previous
Next: 8 Xlispの組込み関数の追加法 Up: 7 ガーベッジコレクション Previous: 7.1 mark

7.2 sweep

マークのついていないノードをかきあつめて,フリーリストを 作ってゆくための処理がsweepです.フリーリストは, 新しいノードを作るときに使われます.つまり,フリーリストの 先頭から順に使われてゆきます.

LOCAL sweep()
{
    SEGMENT *seg;
    LVAL p;
    int n;

    /* empty the free list */
    fnodes = NIL;
    nfree = 0L;

    /* add all unmarked nodes */
    for (seg = segs; seg; seg = seg->sg_next) {
        if (seg == fixseg)
            /* don't sweep the fixnum segment */
            continue;
        else if (seg == charseg)
            /* don't sweep the character segment */
            continue;
        p = &seg->sg_nodes[0];
        for (n = seg->sg_size; --n >= 0; ++p)
            if (!(p->n_flags & MARK)) {
                switch (ntype(p)) {
                case STRING:
                        if (getstring(p) != NULL) {
                            total -= (long)getslength(p);
                            free(getstring(p));
                        }
                        break;
                case STREAM:
                        if (getfile(p))
                            osclose(getfile(p));
                        break;
                case SYMBOL:
                case OBJECT:
                case VECTOR:
                case CLOSURE:
                case STRUCT:
                   if (p->n_vsize) {
                      total -= (long) (p->n_vsize * 
                                      sizeof(LVAL));
                      free(p->n_vdata);
                      }
                   break;
                }
                p->n_type = FREE;
                rplaca(p,NIL);
                rplacd(p,fnodes);
                fnodes = p;
                nfree += 1L;
            }
            else
                p->n_flags &= ~MARK;
    }
}


generated through LaTeX2HTML. M.Inaba 平成18年5月6日