/* gc - garbage collect (only called here and in xlimage.c) */ void gc(void) { register LVAL **p,*ap,tmp; char buf[STRMAX+1]; LVAL *newfp,fun; extern LVAL profile_fixnum; /* print the start of the gc message */ if (s_gcflag && getvalue(s_gcflag)) { sprintf(buf,"[ gc: total %ld, ",nnodes); stdputstr(buf); } /* mark the fixnum used by profiler */ if (!null(profile_fixnum)) mark(profile_fixnum); /* mark the obarray, the argument list and the current environment */ if (obarray) mark(obarray); if (xlenv) mark(xlenv); if (xlfenv) mark(xlfenv); if (xldenv) mark(xldenv); /* mark the evaluation stack */ for (p = xlstack; p < xlstktop; ++p) if (tmp = **p) mark(tmp); /* mark the argument stack */ for (ap = xlargstkbase; ap < xlsp; ++ap) if (tmp = *ap) mark(tmp); /* sweep memory collecting all unmarked nodes */ sweep(); /* count the gc call */ ++gccalls; /* call the *gc-hook* if necessary */ if (s_gchook && (fun = getvalue(s_gchook))) { newfp = xlsp; pusharg(cvfixnum((FIXTYPE)(newfp - xlfp))); pusharg(fun); pusharg(cvfixnum((FIXTYPE)2)); pusharg(cvfixnum((FIXTYPE)nnodes)); pusharg(cvfixnum((FIXTYPE)nfree)); xlfp = newfp; xlapply(2); } /* print the end of the gc message */ if (s_gcflag && getvalue(s_gcflag)) { sprintf(buf,"%ld free", nfree); stdputstr(buf); /* print additional info (e.g. sound blocks in Nyquist) */ print_local_gc_info(); stdputstr(" ]\n"); } }