Annotation of 43BSDTahoe/ucb/pascal/px/utilities.c, revision 1.1

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

unix.superglobalmegacorp.com

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