12083Smckusick /* Copyright (c) 1979 Regents of the University of California */
22083Smckusick 
3*2953Smckusic static char sccsid[] = "@(#)utilities.c 1.3 03/06/81";
42083Smckusick 
5*2953Smckusic #include	"whoami.h"
62083Smckusick #include	"vars.h"
72083Smckusick #include	"panics.h"
82083Smckusick #include	"h02opcs.h"
92083Smckusick 
102083Smckusick stats()
112083Smckusick {
122083Smckusick 	struct	{
132083Smckusick 		long	usr_time;
142083Smckusick 		long	sys_time;
152083Smckusick 		long	child_usr_time;
162083Smckusick 		long	child_sys_time;
172110Smckusic 	} tbuf;
182083Smckusick 	register double l;
192083Smckusick 	register long count;
202110Smckusic #	ifdef PROFILE
212110Smckusic #	define	proffile	"/vb/grad/mckusick/px/profile/pcnt.out"
222110Smckusic 	struct cntrec {
232110Smckusic 		double	counts[NUMOPS];	/* instruction counts */
242110Smckusic 		long	runs;		/* number of interpreter runs */
252110Smckusic 		long	startdate;	/* date profile started */
262110Smckusic 		long	usrtime;	/* total user time consumed */
272110Smckusic 		long	systime;	/* total system time consumed */
282110Smckusic 		double	stmts;		/* number of pascal stmts executed */
292110Smckusic 	} profdata;
302110Smckusic 	FILE *datafile;
312110Smckusic #	endif PROFILE
322083Smckusick 
332083Smckusick 	if (_nodump)
342083Smckusick 		return(0);
352083Smckusick 	times(&tbuf);
362110Smckusic #	ifdef PROFILE
372083Smckusick 	datafile = fopen(proffile,"r");
382110Smckusic 	if (datafile == NULL)
392110Smckusic 		goto skipprof;
402110Smckusic 	count = fread(&profdata,1,sizeof(profdata),datafile);
412110Smckusic 	if (count != sizeof(profdata))
422110Smckusic 		goto skipprof;
432110Smckusic 	for (count = 0;  count < NUMOPS;  count++)
442110Smckusic 		profdata.counts[count] += _profcnts[count];
452110Smckusic 	profdata.runs += 1;
462110Smckusic 	profdata.stmts += _stcnt;
472110Smckusic 	profdata.usrtime += tbuf.usr_time;
482110Smckusic 	profdata.systime += tbuf.sys_time;
492110Smckusic 	datafile = freopen(proffile,"w",datafile);
502110Smckusic 	if (datafile == NULL)
512110Smckusic 		goto skipprof;
522110Smckusic 	count = fwrite(&profdata,1,sizeof(profdata),datafile);
532110Smckusic 	if (count != sizeof(profdata))
542110Smckusic 		goto skipprof;
552110Smckusic 	fclose(datafile);
562110Smckusic skipprof:
572110Smckusic #	endif PROFILE
582083Smckusick 	l = tbuf.usr_time;
592083Smckusick 	l = l / HZ;
602083Smckusick 	fprintf(stderr,
612083Smckusick 		"\n%1ld statements executed in %04.2f seconds cpu time.\n",
622083Smckusick 		_stcnt,l);
632083Smckusick }
642083Smckusick 
652083Smckusick backtrace(errnum)
66*2953Smckusic 	int	errnum;
672083Smckusick {
682083Smckusick 	register struct disp *mydp;
692083Smckusick 	register struct stack *ap;
702083Smckusick 	register char *cp;
712083Smckusick 	register long i, linum;
722110Smckusic 	struct disply disp;
732083Smckusick 
742083Smckusick 	if (_lino <= 0) {
752083Smckusick 		fputs("Program was not executed.\n",stderr);
762083Smckusick 		return;
772083Smckusick 	}
782110Smckusic 	disp = _display;
792083Smckusick 	if (errnum == PINTR)
802083Smckusick 		fputs("\n\tInterrupted in \"",stderr);
812083Smckusick 	else if (errnum == PHALT)
822083Smckusick 		fputs("\n\tHalted in \"",stderr);
832083Smckusick 	else
842083Smckusick 		fputs("\n\tError in \"",stderr);
852083Smckusick 	mydp = _dp;
862083Smckusick 	linum = _lino;
872083Smckusick 	for (;;) {
882083Smckusick 		ap = mydp->stp;
892083Smckusick 		i = linum - (((ap)->entry)->offset & 0177777);
902083Smckusick 		fprintf(stderr,"%s\"",(ap->entry)->name);
912083Smckusick 		if (_nodump == 0)
92*2953Smckusic 			fprintf(stderr,"+%D near line %D.",i,linum);
932083Smckusick 		fputc('\n',stderr);
942083Smckusick 		*mydp = (ap)->odisp;
952110Smckusic 		if (mydp <= &_display.frame[1]){
962110Smckusic 			_display = disp;
972083Smckusick 			psexit(errnum);
982083Smckusick 		}
992083Smckusick 		mydp = (ap)->dp;
1002083Smckusick 		linum = (ap)->lino;
1012083Smckusick 		fputs("\tCalled by \"",stderr);
1022083Smckusick 	}
1032083Smckusick }
1042083Smckusick 
1052083Smckusick psexit(code)
1062083Smckusick 
107*2953Smckusic 	int	code;
1082083Smckusick {
1092083Smckusick 	if (_pcpcount != 0)
1102083Smckusick 		PMFLUSH(_cntrs, _rtns, _pcpcount);
1112083Smckusick 	if (_mode == PIX) {
1122083Smckusick 		fputs("Execution terminated",stderr);
1132083Smckusick 		if (code)
1142083Smckusick 			fputs(" abnormally",stderr);
1152083Smckusick 		fputc('.',stderr);
1162083Smckusick 		fputc('\n',stderr);
1172083Smckusick 	}
1182083Smckusick 	stats();
1192083Smckusick 	exit(code);
1202083Smckusick }
121