|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2:
3: static char sccsid[] = "@(#)utilities.c 1.4 3/6/81";
4:
5: #include "whoami.h"
6: #include "vars.h"
7: #include "panics.h"
8: #include "h02opcs.h"
9:
10: stats()
11: {
12: struct {
13: long usr_time;
14: long sys_time;
15: long child_usr_time;
16: long child_sys_time;
17: } tbuf;
18: register double l;
19: register long count;
20: # ifdef PROFILE
21: # define proffile "/vb/grad/mckusick/px/profile/pcnt.out"
22: struct cntrec {
23: double counts[NUMOPS]; /* instruction counts */
24: long runs; /* number of interpreter runs */
25: long startdate; /* date profile started */
26: long usrtime; /* total user time consumed */
27: long systime; /* total system time consumed */
28: double stmts; /* number of pascal stmts executed */
29: } profdata;
30: FILE *datafile;
31: # endif PROFILE
32:
33: if (_nodump)
34: return(0);
35: times(&tbuf);
36: # ifdef PROFILE
37: datafile = fopen(proffile,"r");
38: if (datafile == NULL)
39: goto skipprof;
40: count = fread(&profdata,1,sizeof(profdata),datafile);
41: if (count != sizeof(profdata))
42: goto skipprof;
43: for (count = 0; count < NUMOPS; count++)
44: profdata.counts[count] += _profcnts[count];
45: profdata.runs += 1;
46: profdata.stmts += _stcnt;
47: profdata.usrtime += tbuf.usr_time;
48: profdata.systime += tbuf.sys_time;
49: datafile = freopen(proffile,"w",datafile);
50: if (datafile == NULL)
51: goto skipprof;
52: count = fwrite(&profdata,1,sizeof(profdata),datafile);
53: if (count != sizeof(profdata))
54: goto skipprof;
55: fclose(datafile);
56: skipprof:
57: # endif PROFILE
58: l = tbuf.usr_time;
59: l = l / HZ;
60: fprintf(stderr,
61: "\n%1ld statements executed in %04.2f seconds cpu time.\n",
62: _stcnt,l);
63: }
64:
65: backtrace(errnum)
66: int errnum;
67: {
68: register struct disp *mydp;
69: register struct stack *ap;
70: register char *cp;
71: register long i, linum;
72: struct disply disp;
73:
74: if (_lino <= 0) {
75: fprintf(stderr,"Program was not executed.\n");
76: return;
77: }
78: disp = _display;
79: if (errnum == PINTR)
80: fprintf(stderr,"\n\tInterrupted in \"");
81: else if (errnum == PHALT)
82: fprintf(stderr,"\n\tHalted in \"");
83: else
84: fprintf(stderr,"\n\tError in \"");
85: mydp = _dp;
86: linum = _lino;
87: for (;;) {
88: ap = mydp->stp;
89: i = linum - (((ap)->entry)->offset & 0177777);
90: fprintf(stderr,"%s\"",(ap->entry)->name);
91: if (_nodump == FALSE)
92: fprintf(stderr,"+%D near line %D.",i,linum);
93: fputc('\n',stderr);
94: *mydp = (ap)->odisp;
95: if (mydp <= &_display.frame[1]){
96: _display = disp;
97: psexit(errnum);
98: }
99: mydp = (ap)->dp;
100: linum = (ap)->lino;
101: fprintf(stderr,"\tCalled by \"");
102: }
103: }
104:
105: psexit(code)
106:
107: int code;
108: {
109: if (_pcpcount != 0)
110: PMFLUSH(_cntrs, _rtns, _pcpcount);
111: if (_mode == PIX) {
112: fprintf(stderr,"Execution terminated");
113: if (code)
114: fprintf(stderr," abnormally");
115: fputc('.',stderr);
116: fputc('\n',stderr);
117: }
118: stats();
119: exit(code);
120: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.