Annotation of 42BSD/ucb/pascal/px/utilities.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.