Commit | Line | Data |
---|---|---|
d442e603 CH |
1 | #include "stdio.h" |
2 | #include "h00vars.h" | |
3 | #include "h01errs.h" | |
4 | #define HZ 60 /* interrupt frequency */ | |
5 | ||
6 | backtrace(errnum) | |
7 | long errnum; | |
8 | { | |
9 | register struct stack **mydp, *ap; | |
10 | struct stack **dp, *disp[20]; | |
11 | register char *cp; | |
12 | register long i; | |
13 | long linum; | |
14 | ||
15 | fetchdp(&dp,&linum); | |
16 | for (i=0; i<20; i++) | |
17 | disp[i] = display[i]; | |
18 | if (errnum == EINTR) | |
19 | fputs("\n\tInterrupted at \"",stderr); | |
20 | else if (errnum == EHALT) | |
21 | fputs("\n\tHalted at \"",stderr); | |
22 | else | |
23 | fputs("\n\tError at \"",stderr); | |
24 | if (linum <= 0) | |
25 | return; | |
26 | mydp = dp; | |
27 | for (;;){ | |
28 | ap = *mydp; | |
29 | cp = &((ap)->entry)->name[0]; | |
30 | i = 8; | |
31 | do | |
32 | putc(*cp++,stderr); | |
33 | while (--i && *cp != ' '); | |
34 | i = linum - (((ap)->entry)->offset & 0177777); | |
35 | fprintf(stderr,"\"+%1d near line %1d.\n",i,linum); | |
36 | *mydp = (ap)->disp; | |
37 | if (mydp <= &display[addrsze >> 2]){ | |
38 | for (i=0; i<20; i++) | |
39 | display[i] = disp[i]; | |
40 | return; | |
41 | } | |
42 | mydp = (ap)->dp; | |
43 | linum = (ap)->lino; | |
44 | fputs("\tCalled by \"",stderr); | |
45 | } | |
46 | } | |
47 | \f | |
48 | stats() | |
49 | { | |
50 | struct { | |
51 | long usr_time; | |
52 | long sys_time; | |
53 | long child_usr_time; | |
54 | long child_sys_time; | |
55 | } tbuf; | |
56 | register double l; | |
57 | register long count; | |
58 | ||
59 | if (nodump) | |
60 | return(0); | |
61 | times(&tbuf); | |
62 | #ifdef profile | |
63 | datafile = fopen(proffile,"r"); | |
64 | if (datafile != NULL) { | |
65 | count = fread(&profdata,sizeof(profdata),1,datafile); | |
66 | if (count != 1) { | |
67 | for (count = 0; count < numops; count++) | |
68 | profdata.counts[count] = 0.0; | |
69 | profdata.runs = 0; | |
70 | profdata.startdate = time(0); | |
71 | profdata.usrtime = 0; | |
72 | profdata.systime = 0; | |
73 | profdata.stmts = 0; | |
74 | } | |
75 | for (count = 0; count < numops; count++) | |
76 | profdata.counts[count] += profcnts[count]; | |
77 | profdata.runs += 1; | |
78 | profdata.stmts += stcnt; | |
79 | profdata.usrtime += tbuf.usr_time; | |
80 | profdata.systime += tbuf.sys_time; | |
81 | datafile = freopen(proffile,"w",datafile); | |
82 | if (datafile != NULL) { | |
83 | fwrite(&profdata,sizeof(profdata),1,datafile); | |
84 | fclose(datafile); | |
85 | } | |
86 | } | |
87 | #endif | |
88 | l = tbuf.usr_time; | |
89 | l = l / HZ; | |
90 | fprintf(stderr,"\n%1ld statements executed in %04.2f seconds cpu time.\n", | |
91 | stcnt,l); | |
92 | } |