1*2083Smckusick /* Copyright (c) 1979 Regents of the University of California */
2*2083Smckusick 
3*2083Smckusick static char sccsid[] = "@(#)utilities.c 1.1 01/07/81";
4*2083Smckusick 
5*2083Smckusick #include	"vars.h"
6*2083Smckusick #include	"panics.h"
7*2083Smckusick #include	"h02opcs.h"
8*2083Smckusick 
9*2083Smckusick stats()
10*2083Smckusick {
11*2083Smckusick 	struct	{
12*2083Smckusick 		long	usr_time;
13*2083Smckusick 		long	sys_time;
14*2083Smckusick 		long	child_usr_time;
15*2083Smckusick 		long	child_sys_time;
16*2083Smckusick 		} tbuf;
17*2083Smckusick 	register double l;
18*2083Smckusick 	register long count;
19*2083Smckusick 
20*2083Smckusick 	if (_nodump)
21*2083Smckusick 		return(0);
22*2083Smckusick 	times(&tbuf);
23*2083Smckusick #ifdef profile
24*2083Smckusick 	datafile = fopen(proffile,"r");
25*2083Smckusick 	if (datafile != NULL) {
26*2083Smckusick 		count = fread(&profdata,sizeof(profdata),1,datafile);
27*2083Smckusick 		if (count != 1) {
28*2083Smckusick 			for (count = 0;  count < numops;  count++)
29*2083Smckusick 				profdata.counts[count] = 0.0;
30*2083Smckusick 			profdata.runs = 0;
31*2083Smckusick 			profdata.startdate = time(0);
32*2083Smckusick 			profdata.usrtime = 0;
33*2083Smckusick 			profdata.systime = 0;
34*2083Smckusick 			profdata.stmts = 0;
35*2083Smckusick 		}
36*2083Smckusick 		for (count = 0;  count < numops;  count++)
37*2083Smckusick 			profdata.counts[count] += profcnts[count];
38*2083Smckusick 		profdata.runs += 1;
39*2083Smckusick 		profdata.stmts += stcnt;
40*2083Smckusick 		profdata.usrtime += tbuf.usr_time;
41*2083Smckusick 		profdata.systime += tbuf.sys_time;
42*2083Smckusick 		datafile = freopen(proffile,"w",datafile);
43*2083Smckusick 		if (datafile != NULL) {
44*2083Smckusick 			fwrite(&profdata,sizeof(profdata),1,datafile);
45*2083Smckusick 			fclose(datafile);
46*2083Smckusick 		}
47*2083Smckusick 	}
48*2083Smckusick #endif
49*2083Smckusick 	l = tbuf.usr_time;
50*2083Smckusick 	l = l / HZ;
51*2083Smckusick 	fprintf(stderr,
52*2083Smckusick 		"\n%1ld statements executed in %04.2f seconds cpu time.\n",
53*2083Smckusick 		_stcnt,l);
54*2083Smckusick }
55*2083Smckusick 
56*2083Smckusick backtrace(errnum)
57*2083Smckusick 	long	errnum;
58*2083Smckusick {
59*2083Smckusick 	register struct disp *mydp;
60*2083Smckusick 	register struct stack *ap;
61*2083Smckusick 	register char *cp;
62*2083Smckusick 	register long i, linum;
63*2083Smckusick 	struct disp disp[MAXLVL];
64*2083Smckusick 
65*2083Smckusick 	if (_lino <= 0) {
66*2083Smckusick 		fputs("Program was not executed.\n",stderr);
67*2083Smckusick 		return;
68*2083Smckusick 	}
69*2083Smckusick 	for (i=0; i<MAXLVL; i++)
70*2083Smckusick 		disp[i] = _display[i];
71*2083Smckusick 	if (errnum == PINTR)
72*2083Smckusick 		fputs("\n\tInterrupted in \"",stderr);
73*2083Smckusick 	else if (errnum == PHALT)
74*2083Smckusick 		fputs("\n\tHalted in \"",stderr);
75*2083Smckusick 	else
76*2083Smckusick 		fputs("\n\tError in \"",stderr);
77*2083Smckusick 	mydp = _dp;
78*2083Smckusick 	linum = _lino;
79*2083Smckusick 	for (;;) {
80*2083Smckusick 		ap = mydp->stp;
81*2083Smckusick 		i = linum - (((ap)->entry)->offset & 0177777);
82*2083Smckusick 		fprintf(stderr,"%s\"",(ap->entry)->name);
83*2083Smckusick 		if (_nodump == 0)
84*2083Smckusick 			fprintf(stderr,"+%1d near line %1d.",i,linum);
85*2083Smckusick 		fputc('\n',stderr);
86*2083Smckusick 		*mydp = (ap)->odisp;
87*2083Smckusick 		if (mydp <= &_display[1]){
88*2083Smckusick 			for (i=0; i<MAXLVL; i++)
89*2083Smckusick 				_display[i] = disp[i];
90*2083Smckusick 			psexit(errnum);
91*2083Smckusick 		}
92*2083Smckusick 		mydp = (ap)->dp;
93*2083Smckusick 		linum = (ap)->lino;
94*2083Smckusick 		fputs("\tCalled by \"",stderr);
95*2083Smckusick 	}
96*2083Smckusick }
97*2083Smckusick 
98*2083Smckusick psexit(code)
99*2083Smckusick 
100*2083Smckusick 	long	code;
101*2083Smckusick {
102*2083Smckusick 	if (_pcpcount != 0)
103*2083Smckusick 		PMFLUSH(_cntrs, _rtns, _pcpcount);
104*2083Smckusick 	if (_mode == PIX) {
105*2083Smckusick 		fputs("Execution terminated",stderr);
106*2083Smckusick 		if (code)
107*2083Smckusick 			fputs(" abnormally",stderr);
108*2083Smckusick 		fputc('.',stderr);
109*2083Smckusick 		fputc('\n',stderr);
110*2083Smckusick 	}
111*2083Smckusick 	stats();
112*2083Smckusick 	exit(code);
113*2083Smckusick }
114