Next: 8 Xlispの組込み関数の追加法
Up: 7 ガーベッジコレクション
Previous: 7.1 mark
マークのついていないノードをかきあつめて,フリーリストを
作ってゆくための処理が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日