|
|
1.1 ! root 1: /* Copyright (c) 1979 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)utilities.c 1.8 7/2/83"; ! 4: ! 5: #include <signal.h> ! 6: #include "whoami.h" ! 7: #include "vars.h" ! 8: #include "objfmt.h" ! 9: #include <sys/time.h> ! 10: #include <sys/resource.h> ! 11: ! 12: stats() ! 13: { ! 14: struct rusage ru; ! 15: register double l; ! 16: register long count; ! 17: # ifdef PROFILE ! 18: # define proffile "/vb/grad/mckusick/px/profile/pcnt.out" ! 19: struct cntrec { ! 20: double counts[NUMOPS]; /* instruction counts */ ! 21: long runs; /* number of interpreter runs */ ! 22: long startdate; /* date profile started */ ! 23: long usrtime; /* total user time consumed */ ! 24: long systime; /* total system time consumed */ ! 25: double stmts; /* number of pascal stmts executed */ ! 26: } profdata; ! 27: FILE *datafile; ! 28: # endif PROFILE ! 29: ! 30: if (_nodump) ! 31: return(0); ! 32: getrusage(RUSAGE_SELF, &ru); ! 33: # ifdef PROFILE ! 34: datafile = fopen(proffile,"r"); ! 35: if (datafile == NULL) ! 36: goto skipprof; ! 37: count = fread(&profdata,1,sizeof(profdata),datafile); ! 38: if (count != sizeof(profdata)) ! 39: goto skipprof; ! 40: for (count = 0; count < NUMOPS; count++) ! 41: profdata.counts[count] += _profcnts[count]; ! 42: profdata.runs += 1; ! 43: profdata.stmts += _stcnt; ! 44: profdata.usrtime += ru.ru_utime.tv_sec; ! 45: profdata.systime += ru.ru_stime.tv_sec; ! 46: datafile = freopen(proffile,"w",datafile); ! 47: if (datafile == NULL) ! 48: goto skipprof; ! 49: count = fwrite(&profdata,1,sizeof(profdata),datafile); ! 50: if (count != sizeof(profdata)) ! 51: goto skipprof; ! 52: fclose(datafile); ! 53: skipprof: ! 54: # endif PROFILE ! 55: fprintf(stderr, ! 56: "\n%1ld statements executed in %04d.%02d seconds cpu time.\n", ! 57: _stcnt, ru.ru_utime.tv_sec, ru.ru_utime.tv_usec / 1000); ! 58: } ! 59: ! 60: backtrace(type) ! 61: char *type; ! 62: { ! 63: register struct dispsave *mydp; ! 64: register struct blockmark *ap; ! 65: register char *cp; ! 66: register long i, linum; ! 67: struct display disp; ! 68: ! 69: if (_lino <= 0) { ! 70: fputs("Program was not executed.\n",stderr); ! 71: return; ! 72: } ! 73: disp = _display; ! 74: fprintf(stderr, "\n\t%s in \"", type); ! 75: mydp = _dp; ! 76: linum = _lino; ! 77: for (;;) { ! 78: ap = mydp->stp; ! 79: i = linum - (((ap)->entry)->offset & 0177777); ! 80: fprintf(stderr,"%s\"",(ap->entry)->name); ! 81: if (_nodump == FALSE) ! 82: fprintf(stderr,"+%D near line %D.",i,linum); ! 83: fputc('\n',stderr); ! 84: *mydp = (ap)->odisp; ! 85: if (mydp <= &_display.frame[1]){ ! 86: _display = disp; ! 87: return; ! 88: } ! 89: mydp = (ap)->dp; ! 90: linum = (ap)->lino; ! 91: fputs("\tCalled by \"",stderr); ! 92: } ! 93: } ! 94: ! 95: psexit(code) ! 96: ! 97: int code; ! 98: { ! 99: if (_pcpcount != 0) ! 100: PMFLUSH(_cntrs, _rtns, _pcpcount); ! 101: if (_mode == PIX) { ! 102: fputs("Execution terminated",stderr); ! 103: if (code) ! 104: fputs(" abnormally",stderr); ! 105: fputc('.',stderr); ! 106: fputc('\n',stderr); ! 107: } ! 108: stats(); ! 109: exit(code); ! 110: } ! 111: ! 112: /* ! 113: * Routines to field various types of signals ! 114: * ! 115: * catch a library error and generate a backtrace ! 116: */ ! 117: liberr() ! 118: { ! 119: backtrace("Error"); ! 120: psexit(2); ! 121: } ! 122: ! 123: /* ! 124: * catch an interrupt and generate a backtrace ! 125: */ ! 126: intr() ! 127: { ! 128: signal(SIGINT, intr); ! 129: backtrace("Interrupted"); ! 130: psexit(1); ! 131: } ! 132: ! 133: /* ! 134: * catch memory faults ! 135: */ ! 136: memsize() ! 137: { ! 138: signal(SIGSEGV, memsize); ! 139: ERROR("Run time stack overflow\n"); ! 140: } ! 141: ! 142: /* ! 143: * catch random system faults ! 144: */ ! 145: syserr(signum) ! 146: int signum; ! 147: { ! 148: signal(signum, syserr); ! 149: ERROR("Panic: Computational error in interpreter\n"); ! 150: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.