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