Annotation of researchv8dc/cmd/trace/trace2.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <errno.h>
                      3: #include "trace.h"
                      4: #include "trace.d"
                      5: 
                      6:  extern struct TBL       *tbl;
                      7:  extern struct LBT      *lbt;
                      8:  extern struct MBOX      *mbox;
                      9:  extern struct MNAME     *fullname;
                     10:  extern struct REVPOL    **expr;
                     11:  extern struct PROCSTACK **procstack;
                     12: 
                     13:  extern struct VARPARS  *procpars;
                     14:  extern struct TBLPARS  *tblpars;
                     15: 
                     16:  extern struct LOCVARS   *tblvars;
                     17:  extern struct TBLPARS  *tablpars;
                     18: 
                     19:  extern int *reftasks, *processes, *basics;
                     20:  extern int *globvars, *inits, *xob, *effnrstates;
                     21: 
                     22:  extern char qoverride;
                     23:  extern int QMAX, msgbase, maxcol, assertbl, errortbl;
                     24:  extern int errno;
                     25: 
                     26: #define tell(s)        fprintf(stderr, s)
                     27: 
                     28: usage(str)
                     29:        char *str;
                     30: {      fprintf(stderr, "trace: %s\n", str);
                     31:        tell("usage: trace [-?] [N]\n");
                     32:        tell("\t-a report on prefixes leading into old states\n");
                     33:        tell("\t-b `blast mode' (quick, very partial search)\n");
                     34:        tell("\t-c  N  perform class N validation (N: 0..5) \n");
                     35:        tell("\t-f or -F format queue histories (two choices)\n");
                     36:        tell("\t-i ignore pvar values in the analysis (rarely useful)\n");
                     37:        tell("\t-j stop at the first buffer lock found\n");
                     38:        tell("\t-k  N  restrict the state space cache to N thousand states\n");
                     39:        tell("\t-l report also normal execution sequences and loops\n");
                     40:        tell("\t-m  N  set bound N on the search depth\n");
                     41:        tell("\t-n don't use timeout heuristics\n");
                     42:        tell("\t-q  N  set bound N on maximum queue size used\n");
                     43:        tell("\t-r  N  restrict the runtime to  N minutes (overrides -R)\n");
                     44:        tell("\t-R  N  report on progress every N minutes (overrides -r)\n");
                     45:        tell("\t-s show only the transition tables\n");
                     46:        tell("\t-t  N  ignore the state of process N (rarely useful)\n");
                     47:        tell("\t-v verbose - print execution times, etc.\n");
                     48:        tell("\t-x perform quick partial search\n");
                     49:        tell("\t-y ignore the queues in the analysis (rarely useful)\n");
                     50:        tell("\t-z (or no flag) guess parameters for a partial search\n");
                     51:        exit(1);
                     52: }
                     53: 
                     54: /*
                     55:  * calls on Emalloc and Realloc go straight to the library malloc
                     56:  * it is used for data that may be realloced but is never released
                     57:  *
                     58:  * Smalloc claims memory that is never realloced and never released
                     59:  *
                     60:  * emalloc and efree handle memory that is never realloced but often released
                     61:  *
                     62:  * talloc and tfree are direct calls on the tac-package (used via emalloc)
                     63:  */
                     64: 
                     65: char *
                     66: Stake(n)
                     67: { char * sbrk();
                     68:   char * try;
                     69:        do {
                     70:                try = sbrk(n);
                     71:        } while ((int) try == -1 && errno == EINTR);
                     72: 
                     73: 
                     74:        if ((int) try == -1)
                     75:                whoops("sbrk fault");
                     76: 
                     77:        return try;
                     78: }
                     79: 
                     80: #define CHUNK  4096
                     81: 
                     82:   char *have;
                     83:   long left = 0;
                     84: 
                     85: char *
                     86: Smalloc(n)
                     87:        unsigned n;
                     88: { char *try;
                     89: 
                     90:        if (n == 0)
                     91:                return (char *) NULL;
                     92: 
                     93:        if (left < n)
                     94:        {       unsigned grow = (n < CHUNK) ? CHUNK : n;
                     95:                have = Stake(grow);
                     96:                left = grow;
                     97:        }
                     98:        try = have;
                     99:        have += n;
                    100:        left -= n;
                    101: 
                    102:        return try;
                    103: }
                    104: 
                    105: char *
                    106: Emalloc(n)
                    107:        unsigned n;
                    108: { char *try;
                    109:   char *malloc();
                    110: 
                    111:        if (n == 0)
                    112:                return (char *) NULL;
                    113: 
                    114:        if ((try = malloc(n)) == NULL)
                    115:                whoops("malloc fault");         /* to be reallocated */
                    116:        return try;
                    117: }
                    118: 
                    119: char *
                    120: Realloc(a, b)
                    121:        char *a; unsigned b;
                    122: { char *try, *realloc();
                    123: 
                    124:        if (b == 0)
                    125:                return (char *) NULL;
                    126: 
                    127:        try = realloc(a, b);    /* standard realloc: never released again */
                    128:        if (try == NULL)
                    129:                whoops("realloc returns 0");
                    130: 
                    131:        return try;
                    132: }
                    133: 
                    134: char *
                    135: emalloc(n)
                    136:        unsigned n;
                    137: { char *try;
                    138:   char *talloc();
                    139: 
                    140:        if (n == 0)
                    141:                return (char *) NULL;
                    142:        if ((try = talloc(n)) == NULL)
                    143:                whoops("talloc fault");
                    144:        return try;
                    145: }
                    146: 
                    147: efree(at)
                    148:        char *at;
                    149: {
                    150:        if (at == NULL)
                    151:                return;
                    152:        tfree(at);
                    153: }
                    154: 
                    155: alloc1(x, y, z)
                    156: { int n = x+y;
                    157:        tbl      = (struct TBL *)
                    158:                Smalloc(n * sizeof(struct TBL));
                    159:        tblpars  = (struct TBLPARS *)
                    160:                Smalloc(n * sizeof(struct TBLPARS));
                    161:        tblvars  = (struct LOCVARS *)
                    162:                Smalloc(n * sizeof(struct LOCVARS));
                    163:        reftasks = (int *)
                    164:                Smalloc(x * sizeof(int));
                    165:        processes = (int *)
                    166:                Smalloc(y * sizeof(int));
                    167:        lbt       = (struct LBT *)
                    168:                Smalloc(y * sizeof(struct LBT));
                    169:        procpars  = (struct VARPARS *)
                    170:                Smalloc(y * sizeof(struct VARPARS));
                    171: 
                    172:        tablpars  = (struct TBLPARS *)
                    173:                Smalloc(y * sizeof(struct TBLPARS));
                    174: 
                    175:        basics    = (int *)
                    176:                Smalloc(y * sizeof(int));
                    177:        procstack = (struct PROCSTACK **)
                    178:                Smalloc(y * sizeof(struct PROCSTACK *));
                    179:        mbox      = (struct MBOX *)
                    180:                Smalloc(z * sizeof(struct MBOX));
                    181: 
                    182:        effnrstates = (int *)
                    183:                Smalloc(n * sizeof(int));
                    184: }
                    185: 
                    186: alloc2(n, m, p, who)
                    187: { char x;
                    188:        if (qoverride && p > QMAX)
                    189:                x = QMAX;
                    190:        else
                    191:                x = p;
                    192: 
                    193:        if (x >= 256)
                    194:                whoops("illegal queue size");
                    195:        if (x >= 16)
                    196:                fprintf(stderr, "warning, very large qsize (%d), queue %d\n", x, n);
                    197: 
                    198:        mbox[n].limit = x;
                    199:        if (who >= 0)
                    200:                mbox[n].owner = who;
                    201:        else
                    202:                mbox[n].owner = 0;
                    203: }
                    204: 
                    205: alloc3(n)
                    206: {      inits = (int *)
                    207:                Smalloc(n * sizeof(int));
                    208: }
                    209: 
                    210: alloc4(n)
                    211: {      if (assertbl == NONE && errortbl == NONE)
                    212:                globvars = (int *)
                    213:                        Smalloc(n * sizeof(int));
                    214:        else
                    215:                globvars = (int *)
                    216:                        Emalloc(n * sizeof(int));
                    217: }
                    218: 
                    219: alloc45(n)
                    220: { register int i;
                    221:        fullname = (struct MNAME *)
                    222:                Smalloc(n * sizeof(struct MNAME));
                    223:        xob = (int *)
                    224:                Smalloc((n+msgbase) * sizeof(int));
                    225:        for (i = 0; i < n+msgbase; i++)
                    226:                xob[i] = -1;
                    227: }
                    228: 
                    229: alloc5(n)
                    230: { register int i, j, r, c;
                    231: 
                    232: 
                    233:        r = tbl[n].nrrows;
                    234:        if ((c = tbl[n].nrcols) > maxcol)
                    235:                maxcol = c;
                    236: 
                    237:        tbl[n].endrow = (int *)
                    238:                Smalloc(r * sizeof(int));
                    239:        tbl[n].deadrow = (int *)
                    240:                Smalloc(r * sizeof(int));
                    241:        tbl[n].badrow = (int *)
                    242:                Smalloc(r * sizeof(int));
                    243:        tbl[n].labrow = (int *)
                    244:                Smalloc(r * sizeof(int));
                    245:        tbl[n].colmap = (int *)
                    246:                Smalloc(c * sizeof(int));
                    247:        tbl[n].colorg = (int *)
                    248:                Smalloc(c * sizeof(int));
                    249: 
                    250:        tbl[n].coltyp = (int *)
                    251:                Smalloc(c * sizeof(int));
                    252:        tbl[n].ptr = (struct IND **)
                    253:                Smalloc(r * sizeof(struct IND *));
                    254: 
                    255:        for (i = 0; i < r; i++)
                    256:        {       tbl[n].ptr[i] = (struct IND *)
                    257:                        Smalloc(c * sizeof(struct IND));
                    258: 
                    259:                for (j = 0; j < c; j++)
                    260:                        tbl[n].ptr[i][j].nrpils = 0;
                    261:                tbl[n].deadrow[i] = 1;
                    262:                tbl[n].endrow[i] = tbl[n].badrow[i] = 0;
                    263:                tbl[n].labrow[i] = 0;
                    264:        }
                    265:        tbl[n].labrow[0] = 1;   /* make sure initial state is always checked */
                    266: }
                    267: 
                    268: alloc6(n, m, p, q)
                    269: {      tbl[n].ptr[m][p].one = (struct ELM *)
                    270:                Smalloc(q * sizeof(struct ELM));
                    271: }
                    272: 
                    273: alloc8(pr, p, q)
                    274: {
                    275:        tablpars[pr].nrms = (short) p;                  /* available */
                    276:        tablpars[pr].nrvs = (short) q;
                    277: 
                    278:        procpars[pr].ms = (short *)
                    279:                Emalloc(p * sizeof(short));
                    280:        procpars[pr].vs = (short *)
                    281:                Emalloc(q * sizeof(short));
                    282: 
                    283:        procpars[pr].nrms = 0;                          /* actually used */
                    284:        procpars[pr].nrvs = 0;
                    285: }
                    286: 
                    287: alloc9(in, p)
                    288: {
                    289:        tbl[in].calls = (struct CPARS *)
                    290:                Smalloc(p * sizeof(struct CPARS));
                    291: }
                    292: 
                    293: alloc10(in, cn, p, q, r)
                    294: {
                    295:        tbl[in].calls[cn].callwhat = (short) p;
                    296:        tbl[in].calls[cn].nrms = (short) q;
                    297:        tbl[in].calls[cn].nrvs = (short) r;
                    298: 
                    299:        tbl[in].calls[cn].ms = (short *)
                    300:                        Smalloc(q * sizeof (short));
                    301: 
                    302:        tbl[in].calls[cn].vs = (short *)
                    303:                        Smalloc(r * sizeof (short));
                    304: }
                    305: 
                    306: whoops(s)
                    307:        char *s;
                    308: {
                    309:        fprintf(stderr, "trace: %s\n", s);
                    310:        output("in sequence: ", 0);
                    311:        postlude();
                    312:        exit(1);
                    313: }
                    314: 
                    315: badinput(s)
                    316:        char *s;
                    317: {
                    318:        fflush(stdout);
                    319:        fprintf(stderr, "trace: bad file `pret.out': %s\n", s);
                    320:        exit(1);
                    321: }

unix.superglobalmegacorp.com

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