BSD 4_2 development
[unix-history] / usr / src / ucb / lisp / franz / lamgc.c
#ifndef lint
static char *rcsid =
"$Header: /na/franz/franz/RCS/lamgc.c,v 1.2 83/04/09 00:37:52 sklower Exp $";
#endif
/* -[Sat Jan 29 13:07:37 1983 by jkf]-
* lamgc.c $Locker: $
* file used to meter gc, not always loaded
*
* (c) copyright 1982, Regents of the University of California
*/
#include "global.h"
#include "gc.h"
#include <sys/types.h>
#ifdef METER
#include <sys/vtimes.h>
#endif
/*
this file is temporary and will contain routines to meter
the garbage collector
*/
/* gcstat - temporary routine used to report on gc statistics.
if this causes variables to be undefined,then it should be removed
*/
extern int *beginsweep,gensymcounter;
int gcstat;
int markdpcount;
int gccount;
int conssame;
int consdiff;
int consnil;
/*
* gcstat - initiate and record gc statistics
* calls:
* (gcstat 0) -- initiate gc statistics by creating gc.out
* and writing header.
* (gcstat 1) -- finish off gc statistics file by writing typetable
* and closing file.
*/
lispval
Lgcstat()
{
register lispval handy;
int nbytes;
struct gchead hhh;
chkarg(1,"gcstat");
if(TYPE(handy=lbot->val) != INT)
{ error("gcstat: non integer arg ",FALSE);
}
switch(handy->i)
{
case 0: if((gcstat = creat("gc.out",0644)) < 0)
error("cant open gc.out",FALSE);
hhh.version = 5;
hhh.lowdata = (int)beginsweep;
printf("writing %d bytes \n",sizeof(hhh));
write(gcstat,(char *)&hhh,sizeof(hhh));
gccount = 0;
return(tatom);
case 1:
/* first write out the type table */
nbytes = 0;
/* 0 means type table follows */
printf("gc's %d, writing %d bytes \n",gccount,
sizeof(nbytes));
write(gcstat,(char *)&nbytes,sizeof(nbytes));
write(gcstat,(char *)&typetable[ATOX(beginsweep)+1],
nbytes = ((int)datalim - (int)beginsweep)>>9);
printf("writing %d bytes \n",nbytes+sizeof(nbytes));
write(gcstat,(char *)&nbytes,sizeof(nbytes));
close(gcstat);
gcstat = 0;
return(inewint(nbytes));
default:
error("Bad value to gcstat ",TRUE);
}
/* NOTREACHED */
}
extern int bitmapi[]; /* a bit of a lie it is really a double array*/
char *bitmapc = (char *)bitmapi;
/* called in the garbage collector after the bit maps have been made
only if gcstat is non zero */
gcdump()
{
#ifdef
extern struct vtimes premark,presweep,alldone;
int nbytes, recsize;
/* 16 bytes/page in the bitmap */
nbytes = (((int) datalim - (int) beginsweep) >> 9) * 16;
recsize = nbytes + 6*sizeof(int) + 3*sizeof(struct vtimes);
write(gcstat,(char *)&recsize,sizeof(recsize)); /* whole record size */
write(gcstat,(char *)&premark,sizeof(premark));
write(gcstat,(char *)&presweep,sizeof(presweep));
write(gcstat,(char *)&alldone,sizeof(alldone));
write(gcstat,(char *)&gensymcounter,sizeof(int));
write(gcstat,(char *)&conssame,sizeof(int));
write(gcstat,(char *)&consdiff,sizeof(int));
write(gcstat,(char *)&consnil,sizeof(int));
write(gcstat,(char *)&markdpcount,sizeof(int));
write(gcstat,(char *)&nbytes,sizeof(nbytes)); /* bit table size */
write(gcstat,(char *)&bitmapc[ATOX(beginsweep) * 16],nbytes);
printf("gc: %d, written %d bytes\n",++gccount,nbytes);
#endif
}