1: #ifndef lint 2: static char *rcsid = 3: "$Header: lamgc.c,v 1.5 84/03/31 22:34:28 layer Exp $"; 4: #endif 5: 6: /* -[Sat Jan 29 13:07:37 1983 by jkf]- 7: * lamgc.c $Locker: $ 8: * file used to meter gc, not always loaded 9: * 10: * (c) copyright 1982, Regents of the University of California 11: */ 12: 13: #include "global.h" 14: #include "gc.h" 15: #include <sys/types.h> 16: #ifdef METER 17: #include <sys/vtimes.h> 18: #endif 19: 20: /* 21: this file is temporary and will contain routines to meter 22: the garbage collector 23: */ 24: 25: /* gcstat - temporary routine used to report on gc statistics. 26: if this causes variables to be undefined,then it should be removed 27: */ 28: 29: extern int *beginsweep,gensymcounter; 30: int gcstat; 31: int mrkdpcnt; 32: int gccount; 33: int conssame; 34: int consdiff; 35: int consnil; 36: 37: 38: /* 39: * gcstat - initiate and record gc statistics 40: * calls: 41: * (gcstat 0) -- initiate gc statistics by creating gc.out 42: * and writing header. 43: * (gcstat 1) -- finish off gc statistics file by writing typetable 44: * and closing file. 45: */ 46: lispval 47: Lgcstat() 48: { 49: register lispval handy; 50: int nbytes; 51: struct gchead hhh; 52: 53: chkarg(1,"gcstat"); 54: 55: if(TYPE(handy=lbot->val) != INT) 56: { error("gcstat: non integer arg ",FALSE); 57: } 58: 59: switch(handy->i) 60: { 61: case 0: if((gcstat = creat("gc.out",0644)) < 0) 62: error("cant open gc.out",FALSE); 63: hhh.version = 5; 64: hhh.lowdata = (int)beginsweep; 65: printf("writing %d bytes \n",sizeof(hhh)); 66: write(gcstat,(char *)&hhh,sizeof(hhh)); 67: gccount = 0; 68: return(tatom); 69: 70: case 1: 71: /* first write out the type table */ 72: nbytes = 0; 73: /* 0 means type table follows */ 74: printf("gc's %d, writing %d bytes \n",gccount, 75: sizeof(nbytes)); 76: write(gcstat,(char *)&nbytes,sizeof(nbytes)); 77: write(gcstat,(char *)&typetable[ATOX(beginsweep)+1], 78: nbytes = ((int)datalim - (int)beginsweep)>>9); 79: printf("writing %d bytes \n",nbytes+sizeof(nbytes)); 80: write(gcstat,(char *)&nbytes,sizeof(nbytes)); 81: close(gcstat); 82: gcstat = 0; 83: return(inewint(nbytes)); 84: default: 85: error("Bad value to gcstat ",TRUE); 86: } 87: /* NOTREACHED */ 88: } 89: extern int bitmapi[]; /* a bit of a lie it is really a double array*/ 90: char *bitmapc = (char *)bitmapi; 91: /* called in the garbage collector after the bit maps have been made 92: only if gcstat is non zero */ 93: gcdump() 94: { 95: #ifdef 96: extern struct vtimes premark,presweep,alldone; 97: int nbytes, recsize; 98: /* 16 bytes/page in the bitmap */ 99: nbytes = (((int) datalim - (int) beginsweep) >> 9) * 16; 100: recsize = nbytes + 6*sizeof(int) + 3*sizeof(struct vtimes); 101: write(gcstat,(char *)&recsize,sizeof(recsize)); /* whole record size */ 102: write(gcstat,(char *)&premark,sizeof(premark)); 103: write(gcstat,(char *)&presweep,sizeof(presweep)); 104: write(gcstat,(char *)&alldone,sizeof(alldone)); 105: write(gcstat,(char *)&gensymcounter,sizeof(int)); 106: write(gcstat,(char *)&conssame,sizeof(int)); 107: write(gcstat,(char *)&consdiff,sizeof(int)); 108: write(gcstat,(char *)&consnil,sizeof(int)); 109: write(gcstat,(char *)&mrkdpcnt,sizeof(int)); 110: write(gcstat,(char *)&nbytes,sizeof(nbytes)); /* bit table size */ 111: write(gcstat,(char *)&bitmapc[ATOX(beginsweep) * 16],nbytes); 112: printf("gc: %d, written %d bytes\n",++gccount,nbytes); 113: #endif 114: }