Annotation of 43BSDReno/lib/csu.tahoe/mon.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)mon.c       2.0 (Tahoe) 5/7/84";
                      2: 
                      3: #define ARCDENSITY     5       /* density of routines */
                      4: #define MINARCS                50      /* minimum number of counters */
                      5: #define        HISTFRACTION    2       /* fraction of text space for histograms */
                      6: 
                      7: 
                      8: struct phdr {
                      9:        char *lpc;
                     10:        char *hpc;
                     11:        int ncnt;
                     12: };
                     13: 
                     14: struct cnt {
                     15:        char *pc;
                     16:        long ncall;
                     17: } *countbase;
                     18: 
                     19: static int cntrs = 0;
                     20: static int profiling = 3;
                     21: static char *s_sbuf;
                     22: static int s_bufsiz;
                     23: static int s_scale;
                     24: static char *s_lowpc;
                     25: 
                     26: int numctrs;
                     27: 
                     28: #define        MSG "No space for monitor buffer(s)\n"
                     29: 
                     30: monstartup(lowpc, highpc)
                     31:        char *lowpc;
                     32:        char *highpc;
                     33: {
                     34:        int monsize;
                     35:        char *buffer;
                     36:        int cntsiz;
                     37:        extern char *sbrk();
                     38:        extern char *minbrk;
                     39: 
                     40: 
                     41:        cntsiz = (highpc - lowpc) * ARCDENSITY / 100;
                     42:        if (cntsiz < MINARCS)
                     43:                cntsiz = MINARCS;
                     44:        monsize = (highpc - lowpc + HISTFRACTION - 1) / HISTFRACTION
                     45:                + sizeof(struct phdr) + cntsiz * sizeof(struct cnt);
                     46:        monsize = (monsize + 1) & ~1;
                     47:        buffer = sbrk(monsize);
                     48:        if (buffer == (char *)-1) {
                     49:                write(2, MSG, sizeof(MSG));
                     50:                return;
                     51:        }
                     52:        minbrk = sbrk(0);
                     53:        monitor(lowpc, highpc, buffer, monsize, cntsiz);
                     54: }
                     55: 
                     56: mcount(cntpa)
                     57:        long **cntpa;
                     58: {
                     59:        register long **cntp;
                     60:        register char *selfpc;
                     61: 
                     62:        /*
                     63:         * find the return address for mcount,
                     64:         * and address of counter pointer
                     65:         */
                     66:        selfpc = *((char **)&cntpa-3);  /* -8(fp) */
                     67:        cntp = cntpa;
                     68:        /*
                     69:         * check that we aren't recursively invoked.
                     70:         */
                     71:        if (profiling)
                     72:                goto out;
                     73:        profiling++;
                     74:        /*
                     75:         * check that counter is allocated
                     76:         */
                     77:        if (*cntp == 0) {
                     78:                /*
                     79:                 * check that a counter is available
                     80:                 */
                     81:                if (cntrs++ == numctrs)
                     82:                        goto overflow;
                     83:                countbase->pc = selfpc;
                     84:                *cntp = &countbase->ncall;
                     85:                countbase++;
                     86:        }
                     87:        (**cntp)++;
                     88:        profiling--;
                     89: out:
                     90:        return;
                     91: 
                     92: overflow:
                     93: #   define     TOLIMIT "mcount: counter overflow\n"
                     94:        write( 2 , TOLIMIT , sizeof( TOLIMIT ) );
                     95:        goto out;
                     96: }
                     97: 
                     98: monitor(lowpc, highpc, buf, bufsiz, cntsiz)
                     99:        char *lowpc, *highpc;
                    100:        char *buf;
                    101:        int bufsiz, cntsiz;
                    102: {
                    103:        register int o;
                    104:        struct phdr *php;
                    105:        static int ssiz;
                    106:        static char *sbuf;
                    107: 
                    108:        if (lowpc == 0) {
                    109:                moncontrol(0);
                    110:                o = creat("mon.out", 0666);
                    111:                write(o, sbuf, ssiz);
                    112:                close(o);
                    113:                return;
                    114:        }
                    115:        sbuf = buf;
                    116:        ssiz = bufsiz;
                    117:        php = (struct phdr *)&buf[0];
                    118:        php->lpc = lowpc;
                    119:        php->hpc = highpc;
                    120:        php->ncnt = cntsiz;
                    121:        numctrs = cntsiz;
                    122:        countbase = (struct cnt *)(buf + sizeof(struct phdr));
                    123:        o = sizeof(struct phdr) + cntsiz * sizeof(struct cnt);
                    124:        buf += o;
                    125:        bufsiz -= o;
                    126:        if (bufsiz <= 0)
                    127:                return;
                    128:        o = (highpc - lowpc);
                    129:        if(bufsiz < o)
                    130:                o = ((float) bufsiz / o) * 65536;
                    131:        else
                    132:                o = 65536;
                    133:        s_scale = o;
                    134:        s_sbuf = buf;
                    135:        s_bufsiz = bufsiz;
                    136:        s_lowpc = lowpc;
                    137:        moncontrol(1);
                    138: }
                    139: 
                    140: /*
                    141:  * Control profiling
                    142:  *     profiling is what mcount checks to see if
                    143:  *     all the data structures are ready.
                    144:  */
                    145: moncontrol(mode)
                    146:     int mode;
                    147: {
                    148:     if (mode) {
                    149:        /* start */
                    150:        profil(s_sbuf, s_bufsiz, s_lowpc, s_scale);
                    151:        profiling = 0;
                    152:     } else {
                    153:        /* stop */
                    154:        profil((char *)0, 0, 0, 0);
                    155:        profiling = 3;
                    156:     }
                    157: }

unix.superglobalmegacorp.com

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