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