BSD 4_2 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Mon, 25 Jul 1983 17:02:25 +0000 (09:02 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Mon, 25 Jul 1983 17:02:25 +0000 (09:02 -0800)
Work on file usr/src/ucb/lisp/franz/lamgc.c

Synthesized-from: CSRG/cd1/4.2

usr/src/ucb/lisp/franz/lamgc.c [new file with mode: 0644]

diff --git a/usr/src/ucb/lisp/franz/lamgc.c b/usr/src/ucb/lisp/franz/lamgc.c
new file mode 100644 (file)
index 0000000..9622938
--- /dev/null
@@ -0,0 +1,114 @@
+#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
+}