Annotation of researchv10no/cmd/trace/Trace, revision 1.1.1.1

1.1       root        1: # To unbundle, sh this file
                      2: echo assert.c 1>&2
                      3: sed 's/.//' >assert.c <<'//GO.SYSIN DD assert.c'
                      4: -#include "trace.h"
                      5: -#include "trace.d"
                      6: -
                      7: - extern struct TBL *tbl;
                      8: - extern int *globvars, nrvars;
                      9: - extern int assertbl, abase, errortbl, ebase;
                     10: -
                     11: -require(TT, stuff, by)
                     12: -{
                     13: -      if (assertbl != NONE)
                     14: -              assert(TT, stuff, by);
                     15: -      if (errortbl != NONE)
                     16: -              errort(TT, stuff, by);
                     17: -}
                     18: -
                     19: -inscope(TT, stuff, by)
                     20: -{ register int i;
                     21: -
                     22: -      for (i = 0; i < tbl[assertbl].nrcols; i++)
                     23: -              if (TT == tbl[assertbl].coltyp[i]
                     24: -              &&  stuff == tbl[assertbl].colmap[i]
                     25: -              &&  by == tbl[assertbl].colorg[i])
                     26: -                      return 1;
                     27: -
                     28: -      return 0;
                     29: -}
                     30: -
                     31: -assert(TT, stuff, by)
                     32: -{ int h, i, j, x, frst;
                     33: -
                     34: -      for (frst = 0; frst < tbl[assertbl].nrcols; frst++)
                     35: -              if (tbl[assertbl].coltyp[frst] == TT
                     36: -              &&  stuff == tbl[assertbl].colmap[frst]
                     37: -              &&  by == tbl[assertbl].colorg[frst])
                     38: -                      break;
                     39: -
                     40: -      if (frst == tbl[assertbl].nrcols)
                     41: -              return;         /* not within assertion's scope */
                     42: -
                     43: -      for (i = 0; i < tbl[assertbl].nrrows; i++)
                     44: -      {
                     45: -              if (globvars[i+abase] != 1)
                     46: -                      continue;
                     47: -
                     48: -              for (j = frst; j < tbl[assertbl].nrcols; j++)
                     49: -              {
                     50: -                      if (TT == tbl[assertbl].coltyp[j]
                     51: -                      &&  stuff == tbl[assertbl].colmap[j]
                     52: -                      &&  by == tbl[assertbl].colorg[j])
                     53: -                      {
                     54: -                       if (tbl[assertbl].ptr[i][j].nrpils == 0)
                     55: -                              output("assertion violated: ", 1);
                     56: -                       else
                     57: -                       for (h = 0; h < tbl[assertbl].ptr[i][j].nrpils; h++)
                     58: -                       {      x = tbl[assertbl].ptr[i][j].one[h].transf;
                     59: -                              globvars[x+abase] = 2;
                     60: -                              globvars[i+abase] = 0;
                     61: -      }       }       }}
                     62: -      for (i = abase; i < nrvars; i++)
                     63: -              if (globvars[i] == 2)
                     64: -                      globvars[i] = 1;
                     65: -}
                     66: -
                     67: -assertholds()
                     68: -{ int i;
                     69: -      if (assertbl == NONE)
                     70: -              return 1;
                     71: -
                     72: -      for (i = abase; i < nrvars; i++)
                     73: -              if (globvars[i] && tbl[assertbl].endrow[i-abase])
                     74: -                      return 1;
                     75: -      return 0;
                     76: -}
                     77: -
                     78: -errort(TT, stuff, by)
                     79: -{ int h, i, j, x, frst;
                     80: -
                     81: -      for (frst = 0; frst < tbl[errortbl].nrcols; frst++)
                     82: -              if (tbl[errortbl].coltyp[frst] == TT
                     83: -              &&  stuff == tbl[errortbl].colmap[frst]
                     84: -              &&  by == tbl[errortbl].colorg[frst])
                     85: -                      break;
                     86: -
                     87: -      if (frst == tbl[errortbl].nrcols)
                     88: -              return;         /* not within assertion's scope */
                     89: -
                     90: -      for (i = 0; i < tbl[errortbl].nrrows; i++)
                     91: -      {
                     92: -              if (globvars[i+ebase] != 1)
                     93: -                      continue;
                     94: -
                     95: -              for (j = frst; j < tbl[errortbl].nrcols; j++)
                     96: -              {
                     97: -                      if (TT == tbl[errortbl].coltyp[j]
                     98: -                      &&  stuff == tbl[errortbl].colmap[j]
                     99: -                      &&  by == tbl[errortbl].colorg[j])
                    100: -                      {
                    101: -                       if (tbl[errortbl].ptr[i][j].nrpils == 0)
                    102: -                              globvars[i+ebase] = 0;
                    103: -                       else
                    104: -                       for (h = 0; h < tbl[errortbl].ptr[i][j].nrpils; h++)
                    105: -                       {      x = tbl[errortbl].ptr[i][j].one[h].transf;
                    106: -                              globvars[x+ebase] = 2;
                    107: -                              globvars[i+ebase] = 0;
                    108: -                       }
                    109: -                      }
                    110: -              }
                    111: -      }
                    112: -      for (i = ebase; i < nrvars; i++)
                    113: -              if (globvars[i] == 2)
                    114: -              {       globvars[i] = 1;
                    115: -                      if (tbl[errortbl].endrow[i-ebase])
                    116: -                              output("error matched: ", 2);
                    117: -              }
                    118: -      globvars[ebase] = 1;
                    119: -}
                    120: -
                    121: -peekassert(ice)
                    122: -      struct FREEZE *ice;
                    123: -{ register int i;
                    124: -  if (assertbl != NONE)
                    125: -      for (i = abase; i < nrvars; i++)
                    126: -              globvars[i] = ice->varsaved[i];
                    127: -  else if (errortbl != NONE)
                    128: -      for (i = ebase; i < nrvars; i++)
                    129: -              globvars[i] = ice->varsaved[i];
                    130: -}
                    131: //GO.SYSIN DD assert.c
                    132: echo cmalloc.c 1>&2
                    133: sed 's/.//' >cmalloc.c <<'//GO.SYSIN DD cmalloc.c'
                    134: -#ifdef debug
                    135: -#define ASSERT(p) if(!(p))botch("p");else
                    136: -botch(s)
                    137: -char *s;
                    138: -{
                    139: -      printf("assertion botched: %s\n",s);
                    140: -      abort();
                    141: -}
                    142: -#else
                    143: -#define ASSERT(p)
                    144: -#endif
                    145: -
                    146: -/*    C storage allocator
                    147: - *    circular first-fit strategy
                    148: - *    works with noncontiguous, but monotonically linked, arena
                    149: - *    each block is preceded by a ptr to the (pointer of) 
                    150: - *    the next following block
                    151: - *    blocks are exact number of words long 
                    152: - *    aligned to the data type requirements of ALIGN
                    153: - *    pointers to blocks must have BUSY bit 0
                    154: - *    bit in ptr is 1 for busy, 0 for idle
                    155: - *    gaps in arena are merely noted as busy blocks
                    156: - *    last block of arena is empty and
                    157: - *    has a pointer to first
                    158: - *    idle blocks are coalesced during space search
                    159: - *
                    160: - *    a different implementation may need to redefine
                    161: - *    ALIGN, NALIGN, BLOCK, BUSY, INT
                    162: - *    where INT is integer type to which a pointer can be cast
                    163: -*/
                    164: -#define INT int
                    165: -#define ALIGN int
                    166: -#define NALIGN 1
                    167: -#define WORD sizeof(union store)
                    168: -#define BLOCK 1024
                    169: -#define BUSY 1
                    170: -#define NULL 0
                    171: -#define testbusy(p) ((INT)(p)&BUSY)
                    172: -#define setbusy(p) (union store *)((INT)(p)|BUSY)
                    173: -#define clearbusy(p) (union store *)((INT)(p)&~BUSY)
                    174: -
                    175: -union store {
                    176: -            union store *ptr;
                    177: -            ALIGN dummy[NALIGN];
                    178: -            int calloc;       /*calloc clears an array of integers*/
                    179: -};
                    180: -
                    181: -static        union store alloca;     /* initial arena */
                    182: -static        union store *allocb = &alloca;  /*arena base*/
                    183: -static        union store *allocp = &alloca;  /*search ptr*/
                    184: -static        union store *alloct = &alloca;  /*arena top; for speedier ialloc*/
                    185: -static        union store allocx, allocy;     /*for benefit of realloc*/
                    186: -extern        char *sbrk();
                    187: -
                    188: -/* a cache list of frequently-used sizes is maintained. From each
                    189: - * cache entry hangs a chain of available blocks (marked busy
                    190: - * to keep out of the first fit search)  
                    191: -*/
                    192: -#define CACHEMAX 100  /* largest block to be cached (in words) */
                    193: -#ifndef pdp11
                    194: -#define CACHESIZ 13   /* number of entries (prime) */
                    195: -#else
                    196: -#define CACHESIZ 0
                    197: -#endif
                    198: -static struct cache {
                    199: -      int size;
                    200: -      union store *chain;
                    201: -} cache[CACHESIZ];
                    202: -
                    203: -char *
                    204: -malloc(nbytes)
                    205: -unsigned nbytes;
                    206: -{
                    207: -      register union store *p, *q;
                    208: -      register nw;
                    209: -      register temp;
                    210: -      register struct cache *cp;
                    211: -
                    212: -      ASSERT(allock(allocp)&1);
                    213: -      nw = (nbytes+WORD+WORD-1)/WORD;
                    214: -      if(CACHESIZ && nw<CACHEMAX && nw>2) {   /* see note + below */
                    215: -              cp = cache + nw%CACHESIZ;
                    216: -              p = cp->chain;
                    217: -              if(p && nw==cp->size) {
                    218: -                      cp->chain = p[1].ptr;
                    219: -                      ASSERT(testbusy(p->ptr));
                    220: -                      ASSERT(clearbusy(p->ptr)-p==nw);
                    221: -                      return (char*)(p+1);
                    222: -              }
                    223: -      }
                    224: -      ASSERT(allock(allocp)&3);
                    225: -      for(; ; ) {     /* done at most twice */
                    226: -              p = allocp;
                    227: -              if(alloca.ptr!=0)               /*C can't initialize union*/
                    228: -              for(temp=0; ; ) {
                    229: -                      if(!testbusy(p->ptr)) {
                    230: -                              while(!testbusy((q=p->ptr)->ptr)) {
                    231: -                                      ASSERT(q>p);
                    232: -                                      p->ptr = q->ptr;
                    233: -                              }
                    234: -                              allocp = p;
                    235: -                              if(q>=p+nw && p+nw>=p)  /*room; no wrap*/
                    236: -                                      goto found;
                    237: -                      }
                    238: -                      q = p;
                    239: -                      p = clearbusy(p->ptr);
                    240: -                      if(p <= q) {
                    241: -                              ASSERT(p==allocb);
                    242: -                              if(++temp>1)
                    243: -                                      break;
                    244: -                      }
                    245: -              }
                    246: -              temp = nw;
                    247: -              p = (union store *)sbrk(0);
                    248: -              q = allocp->ptr;
                    249: -              if(!testbusy(q) && q+1 == p)
                    250: -                      temp -= p - allocp;
                    251: -              temp = ((temp+BLOCK/WORD)/(BLOCK/WORD))*(BLOCK/WORD);
                    252: -              if(p+temp <= p)
                    253: -                      return(NULL);
                    254: -              for( ; ; ) {
                    255: -                      register s;
                    256: -                      q = (union store *)sbrk(temp*WORD);
                    257: -                      if((INT)q != -1)
                    258: -                              break;
                    259: -                      for(cp=cache; cp<cache+CACHESIZ; cp++) {
                    260: -                              for(p=cp->chain; p; p=p[1].ptr) {
                    261: -                                      ASSERT(testbusy(p->ptr));
                    262: -                                      p->ptr = clearbusy(p->ptr);
                    263: -                                      ASSERT(p->ptr-p==cp->size);
                    264: -                              }
                    265: -                              cp->chain = 0;
                    266: -                      }
                    267: -                      s = (temp-nw)/2;
                    268: -                      if(s <= 0)
                    269: -                              return(NULL);
                    270: -                      temp -= s;
                    271: -              }
                    272: -              ialloc((char *)q, (unsigned)temp*WORD);
                    273: -      }
                    274: -found:
                    275: -      q = p + nw;
                    276: -      if(p->ptr > q) {
                    277: -              allocx = *q;
                    278: -              q->ptr = p->ptr;
                    279: -      }
                    280: -      p->ptr = setbusy(q);
                    281: -      ASSERT(allock(allocp)&7);
                    282: -      return((char *)(p+1));
                    283: -}
                    284: -/* + note CACHESIZ is tested for conditional compilation; nw>2 assumes there's
                    285: - * no point in caching smaller sizes (they are rarely used and always
                    286: - * can be allocated) and protects against the old storage compaction trick:
                    287: - * free(p); free(dummy);dummy=malloc(1);realloc(p)
                    288: - * (otherwise free(dummy) would destroy allocy, which pertains to p)
                    289: -*/
                    290: -
                    291: -/*    freeing strategy tuned for LIFO allocation
                    292: -*/
                    293: -free(ap)
                    294: -char *ap;
                    295: -{
                    296: -      register union store *p = (union store *)ap, *q;
                    297: -      register nw;
                    298: -      register struct cache *cp;
                    299: -
                    300: -      --p;
                    301: -      ASSERT(allock(p));
                    302: -      ASSERT(testbusy(p->ptr));
                    303: -      nw = clearbusy(p->ptr) - p;
                    304: -      ASSERT(nw>0);
                    305: -      if(CACHESIZ && nw<CACHEMAX && nw>2) {
                    306: -              cp = cache + nw%CACHESIZ;
                    307: -              if(nw != cp->size) {
                    308: -                      q = cp->chain;
                    309: -                      if(q) {
                    310: -                              ASSERT(testbusy(q->ptr));
                    311: -                              q->ptr = clearbusy(q->ptr);
                    312: -                              ASSERT(q->ptr-q==cp->size);
                    313: -                              cp->chain = q[1].ptr;
                    314: -                      }
                    315: -                      if(!q)
                    316: -                              cp->size = nw;
                    317: -                      else
                    318: -                              goto nocache;
                    319: -              }
                    320: -              allocy = p[1];
                    321: -              p[1].ptr = cp->chain;
                    322: -              cp->chain = p;
                    323: -              ASSERT(allock(allocp)&017);
                    324: -              return;
                    325: -      }
                    326: -nocache:
                    327: -      allocp = p;
                    328: -      p->ptr = clearbusy(p->ptr);
                    329: -      ASSERT(allock(allocp)&037);
                    330: -      ASSERT(p->ptr<=alloct);
                    331: -}
                    332: -
                    333: -/* ialloc(q, nbytes) inserts a block that did not come
                    334: - * from malloc into the arena
                    335: - *
                    336: - * q points to new block
                    337: - * r points to last of new block
                    338: - * p points to last cell of arena before new block
                    339: - * s points to first cell of arena after new block
                    340: -*/
                    341: -ialloc(qq, nbytes)
                    342: -char *qq;
                    343: -unsigned nbytes;
                    344: -{
                    345: -      register union store *p, *q, *s;
                    346: -      union store *r;
                    347: -
                    348: -      q = (union store *)qq;
                    349: -      r = q + (nbytes/WORD) - 1;
                    350: -      q->ptr = r;
                    351: -      if(alloca.ptr==0)               /*C can't initialize union*/
                    352: -              alloca.ptr = &alloca;
                    353: -      if(q > alloct) {
                    354: -              p = alloct;
                    355: -              alloct = r;
                    356: -      } else
                    357: -              allocp = p = allocb;
                    358: -      for( ; ; p=s) {
                    359: -              s = clearbusy(p->ptr);
                    360: -              if(s==allocb)
                    361: -                      break;
                    362: -              ASSERT(s>p);
                    363: -              if(s>r) {
                    364: -                      if(p<q)
                    365: -                              break;
                    366: -                      else
                    367: -                              ASSERT(p>r);
                    368: -              }
                    369: -      }
                    370: -      p->ptr = q==p+1? q: setbusy(q);
                    371: -      r->ptr = s==r+1? s: setbusy(s);
                    372: -      if(allocb > q)
                    373: -              allocp = allocb = q;
                    374: -}
                    375: -
                    376: -/*    realloc(p, nbytes) reallocates a block obtained from malloc()
                    377: - *    and freed since last call of malloc()
                    378: - *    to have new size nbytes, and old content
                    379: - *    returns new location, or 0 on failure
                    380: -*/
                    381: -
                    382: -char *
                    383: -realloc(pp, nbytes)
                    384: -char *pp;
                    385: -unsigned nbytes;
                    386: -{
                    387: -      register union store *q;
                    388: -      register union store *p = (union store *)pp;
                    389: -      register union store *s, *t;
                    390: -      register unsigned nw;
                    391: -      struct cache *cp;
                    392: -      unsigned onw;
                    393: -
                    394: -      q = p-1;
                    395: -      ASSERT(allock(q));
                    396: -      if(testbusy(q->ptr)) {
                    397: -              allocp = q;
                    398: -              q->ptr = clearbusy(q->ptr);
                    399: -              if(CACHESIZ) {
                    400: -                      nw = q->ptr - q;
                    401: -                      cp = cache + nw%CACHESIZ;
                    402: -                      if(cp->chain==q) {
                    403: -                              ASSERT(cp->size==nw);
                    404: -                              cp->chain = p->ptr;     /*p->ptr==q[1].ptr*/
                    405: -                              *p = allocy;
                    406: -                      } else
                    407: -                              ASSERT(notonchain(q,cp->chain));
                    408: -              }
                    409: -      }
                    410: -      onw = q->ptr - p;
                    411: -      q = (union store *)malloc(nbytes);
                    412: -      if(q==NULL || q==p)
                    413: -              return((char *)q);
                    414: -      ASSERT(q<p||q>p[-1].ptr);
                    415: -      s = p;
                    416: -      t = q;
                    417: -      nw = (nbytes+WORD-1)/WORD;
                    418: -      if(nw<onw)
                    419: -              onw = nw;
                    420: -      while(onw--!=0)
                    421: -              *t++ = *s++;
                    422: -      ASSERT(clearbusy(q[-1].ptr)-q==nw);
                    423: -      if(q<p && q+nw>=p)
                    424: -              q[q+nw-p] = allocx;
                    425: -      ASSERT(allock(q-1));
                    426: -      return((char *)q);
                    427: -}
                    428: -
                    429: -#ifdef debug
                    430: -
                    431: -notonchain(p,q)
                    432: -union store *p, *q;
                    433: -{
                    434: -      for(;q; q=clearbusy(q->ptr))
                    435: -              if(q==p)
                    436: -                      return 0;
                    437: -      return 1;
                    438: -}
                    439: -
                    440: -allock(q)
                    441: -union store *q;
                    442: -{
                    443: -#ifdef longdebug
                    444: -      register union store *p, *r;
                    445: -      int x;
                    446: -      for(x=0; x<CACHESIZ; x++) {
                    447: -              p = cache[x].chain;
                    448: -              if(p==0)
                    449: -                      continue;
                    450: -              for( ; p; p=p[1].ptr) {
                    451: -                      ASSERT(testbusy(p->ptr));
                    452: -                      ASSERT(clearbusy(p->ptr)-p==cache[x].size);
                    453: -              }
                    454: -      }
                    455: -      x = 0;
                    456: -      p = allocb;
                    457: -      if(alloca.ptr==0)
                    458: -              return(1);
                    459: -      for( ; (r=clearbusy(p->ptr)) > p; p=r) {
                    460: -              if(p==q)
                    461: -                      x++;
                    462: -      }
                    463: -      return(r==allocb&(x==1|p==q));
                    464: -#else
                    465: -      return(q>=allocb);
                    466: -#endif
                    467: -}
                    468: -#endif
                    469: //GO.SYSIN DD cmalloc.c
                    470: echo makefile 1>&2
                    471: sed 's/.//' >makefile <<'//GO.SYSIN DD makefile'
                    472: -CFLAGS = -g
                    473: -OBJS = malloc_t.o cmalloc.o trace.expr.o trace1.o trace2.o trace3.o trace4.o trace5.o trace6.o trace7.o trace8.o trace9.o assert.o
                    474: -
                    475: -#     FILES:
                    476: -#             trace.h         constants and macro definitions
                    477: -#             trace.d         data structures
                    478: -#             trace1.c        reads in the tables, sets up data structures
                    479: -#             trace2.c        memory allocation       
                    480: -#             trace3.c        the symbolic execution procedures
                    481: -#             trace4.c        state space handler
                    482: -#             trace5.c        lookup table for system states
                    483: -#             trace6.c        lookup table for queue states
                    484: -#             trace7.c        lookup table for leaf-states
                    485: -#             trace8.c        lookup table for variable & parameter states
                    486: -#             trace9.c        lookup table for process states
                    487: -#             trace.expr.c    evaluation of expressions
                    488: -#             malloc_t.c      memory allocation interface to cmalloc.c
                    489: -#             assert.c        assertion primitives
                    490: -
                    491: -trace:        $(OBJS)
                    492: -      cc $(CFLAGS) $(OBJS) -o trace
                    493: -
                    494: -%.o:  %.c trace.d trace.h
                    495: -      cc $(CFLAGS) -c $%.c
                    496: -
                    497: -clean:
                    498: -      rm -f *.o pret.* mon.out core a.out
                    499: -
                    500: -install:
                    501: -      cp trace /usr/bin
                    502: -
                    503: //GO.SYSIN DD makefile
                    504: echo malloc_t.c 1>&2
                    505: sed 's/.//' >malloc_t.c <<'//GO.SYSIN DD malloc_t.c'
                    506: -#include <stdio.h>
                    507: -#include "trace.h"
                    508: -
                    509: -#define DEBUG 0
                    510: -
                    511: -#if DEBUG
                    512: -#define log(e, u, d)  event[e][u] += (long) d;
                    513: -#else
                    514: -#define log(e, u, d)
                    515: -#endif
                    516: -
                    517: -#define A_LARGE 64
                    518: -#define A_USER 0x55000000
                    519: -
                    520: -#define POOL  0
                    521: -#define ALLOC 1
                    522: -#define FREE  2
                    523: -#define NREVENT       3
                    524: -
                    525: - union M {
                    526: -      long size;
                    527: -      union M *link;
                    528: - };
                    529: -
                    530: - union M *freelist[A_LARGE];
                    531: - long  req[A_LARGE];
                    532: - long  event[NREVENT][A_LARGE];
                    533: -
                    534: -char *
                    535: -talloc(u)
                    536: -      long u;
                    537: -{ union M *m;
                    538: -  register r;
                    539: -  char *Smalloc();
                    540: -
                    541: -      u = ((u-1)/sizeof(union M) + 2);
                    542: -
                    543: -      if( u >= A_LARGE )
                    544: -      {       log(ALLOC, 0, (long) 1);
                    545: -              m = (union M *) malloc( u * sizeof(union M) );
                    546: -              if (m == NULL)
                    547: -                      whoops("malloc fault");
                    548: -      } else
                    549: -      {       if( freelist[u] == NULL )
                    550: -              {       r = req[u] += req[u] ? req[u] : 1;
                    551: -                      if (r > NOTOOBIG)
                    552: -                              r = req[u] = NOTOOBIG+1;
                    553: -                      log(POOL, (int) u, (long) r);
                    554: -                      freelist[u] = (union M *) Smalloc( r*u*sizeof(union M) );
                    555: -                      if (freelist[u] == NULL)
                    556: -                              whoops("malloc fault");
                    557: -
                    558: -                      (freelist[u] + u*(r-1))->link = 0;
                    559: -                      for (m = freelist[u] + u*(r-2); m >= freelist[u]; m -= u)
                    560: -                                      m->link = m+u;
                    561: -              }
                    562: -              log(ALLOC, (int) u, (long) 1);
                    563: -
                    564: -              m = freelist[u];
                    565: -              freelist[u] = m->link;
                    566: -      }
                    567: -      m->size = u | A_USER;
                    568: -/*
                    569: -      for (r = 1; r < u; )
                    570: -              (&m->size)[r++] = 0;
                    571: -*/
                    572: -      return (char *) (m+1);
                    573: -}
                    574: -
                    575: -tfree(v)
                    576: -      char *v;
                    577: -{ register union M *m = (union M *) v;
                    578: -  register long u;
                    579: -
                    580: -      --m;
                    581: -      if ( (m->size&0xFF000000) != A_USER)
                    582: -      {       fprintf(stderr, "panic: releasing a free block\n");
                    583: -              kill(getpid(), 3);
                    584: -      }
                    585: -
                    586: -      u = (m->size &= 0xFFFFFF);
                    587: -      if ( u >= A_LARGE )
                    588: -      {       log(FREE, (int) 0, (long) 1);
                    589: -              free(m);
                    590: -      }
                    591: -      else
                    592: -      {       log(FREE, (int) u, (long) 1);
                    593: -              m->link = freelist[u];
                    594: -              freelist[u] = m;
                    595: -      }
                    596: -}
                    597: -
                    598: -#if DEBUG
                    599: -double
                    600: -a_stats()
                    601: -{ register int i;
                    602: -  long p, a, f, j;
                    603: -  long sum = 0;
                    604: -
                    605: -      fprintf(stderr, "chunk\t  pool\tallocs\t frees\t spill\n");
                    606: -      for (i = 0; i < A_LARGE; i++)
                    607: -      {
                    608: -              p = event[POOL][i];
                    609: -              a = event[ALLOC][i];
                    610: -              f = event[FREE][i];
                    611: -
                    612: -              if( !(p|a|f) )
                    613: -                      continue;
                    614: -
                    615: -              j = (long) (i * sizeof(union M));
                    616: -              fprintf(stderr, "%5d\t%6ld\t%6ld\t%6ld\t%6ld\n", j, p, a, f, a-f);
                    617: -
                    618: -              sum += p*j;
                    619: -      }
                    620: -      fprintf(stderr, "total pools  %7u\n", sum);
                    621: -
                    622: -      return (double) sum;
                    623: -}
                    624: -#endif
                    625: //GO.SYSIN DD malloc_t.c
                    626: echo trace.d 1>&2
                    627: sed 's/.//' >trace.d <<'//GO.SYSIN DD trace.d'
                    628: - struct ELM {
                    629: -      short transf;           /* next state function */
                    630: -      short valtrans;         /* value transferred   */
                    631: - };
                    632: -
                    633: - struct IND {
                    634: -      short nrpils;
                    635: -      struct ELM *one;
                    636: - };
                    637: -
                    638: - struct VARPARS {
                    639: -      short nrms,    *ms;             /* message parameters */
                    640: -      short nrvs,    *vs;             /* pvar parameters    */
                    641: -      short nrlvars, *lvarvals;       /* local variables    */
                    642: - };
                    643: -
                    644: - struct TBLPARS {
                    645: -      short nrms;
                    646: -      short nrvs;                     /* max available space for params */    
                    647: -      short nrlvars;                  /* max available space for locvars */
                    648: - };
                    649: -
                    650: - struct LOCVARS {
                    651: -      short nrlvars, *lvarvals;
                    652: - };
                    653: -
                    654: - struct CPARS {
                    655: -      short callwhat;
                    656: -      short nrms,    *ms;             /* message parameters */
                    657: -      short nrvs,    *vs;             /* pvar parameters    */
                    658: - };
                    659: -
                    660: - struct LBT {
                    661: -      int *mapcol, *orgcol;           /* mapped versions of colmap and colorg */
                    662: - };
                    663: -
                    664: -/*
                    665: - *    endrow:         proper endstates of the process table
                    666: - *    deadrow:        set if deadend (eg return state)
                    667: - *    badrow:         row with at least one output option
                    668: - *    labrow:         labeled row (potential start of a loop)
                    669: - */
                    670: -
                    671: - struct TBL {
                    672: -      int nrrows, nrcols;
                    673: -      int *endrow, *deadrow, *badrow, *labrow;
                    674: -      int *colmap, *colorg, *coltyp;
                    675: -      char **rowname;
                    676: -
                    677: -      struct IND **ptr;
                    678: -      struct CPARS *calls;
                    679: - };
                    680: -
                    681: - struct MBOX {
                    682: -      char limit;             /* length of queue */
                    683: -      char owner;             /* the process reading from this queue */
                    684: -      char qname[PLENTY];     /* user-level name for the queue */
                    685: - };
                    686: -
                    687: - struct MNAME {
                    688: -      char mname[PLENTY];
                    689: - };
                    690: -
                    691: - struct BLTIN {
                    692: -      short target;
                    693: -      short type;
                    694: -      short value;
                    695: - };
                    696: -
                    697: - struct REVPOL {
                    698: -      char toktyp;
                    699: -      short tokval;
                    700: - };
                    701: -
                    702: - struct PROCSTACK {
                    703: -      short uptable;                  /* table where we come from         */
                    704: -      short uptransf;                 /* pending transition in that table */
                    705: -
                    706: -      struct VARPARS  *varparsaved;   /* saves parameters and locals */
                    707: -      struct PROCSTACK *follow;       /* next stackframe */
                    708: - };
                    709: -
                    710: -#define USED  32768
                    711: -#define PASSED        16384
                    712: -#define TRAIL 1
                    713: -
                    714: - struct QUEUE {
                    715: -      short mesg;                     /* on rcv PASSED is OR'ed in */
                    716: -      unsigned short cargo;           /* when set USED is OR'ed in */
                    717: -#if TRAIL
                    718: -      short tstate[2];                /* linecode reference */
                    719: -#endif TRAIL
                    720: -      struct QUEUE *next;
                    721: -      struct QUEUE *last;
                    722: -      struct QUEUE *s_forw;
                    723: -      struct QUEUE *s_back;
                    724: - };
                    725: -
                    726: - struct CONTS {
                    727: -      short mesg;
                    728: -      unsigned short cargo;
                    729: - };
                    730: -
                    731: - struct TEMPLATE {
                    732: -      short *g_vars;                  /* current globals   */
                    733: -      struct LOCVARS   **l_vars;      /* current local vars */
                    734: -      struct PROCSTACK **traceback;   /* traceback of complete stack */
                    735: - };
                    736: -
                    737: - struct STATE {
                    738: -      unsigned short *pstate;         /* old states & maps    */
                    739: -      struct TEMPLATE *pcon;          /* variables and stacks */
                    740: -      struct VISIT *next;
                    741: - };
                    742: -
                    743: -#define ANALYZED      16384
                    744: -
                    745: - struct VISIT {
                    746: -      unsigned int howmany;   /* which queues are nonempty */
                    747: -      struct CONTS **c;       /* queue contents  */
                    748: -      union {
                    749: -              struct QUEUE *s;        /* when searching, last message sent  */
                    750: -              short countme;          /* when analyzed, counts nr of returns */
                    751: -      } prop;
                    752: -      unsigned short depth;   /* level of first visit, ANALYZED is OR'ed in */
                    753: -      struct VISIT *next;
                    754: - };
                    755: -
                    756: -#define ISANA(x)      (x->depth &  ANALYZED)
                    757: -#define DEPTH(x)      (x->depth & ~ANALYZED)
                    758: -
                    759: -/*
                    760: - *    normal ppushes (via forward()) save the parameters in the procstack
                    761: - *    so that the corresponding ppop (via backup()) can reset them properly
                    762: - *
                    763: - *    series of ppushes and ppops, performed in a single freeze() call
                    764: - *    (via the retable() and dotable() subroutines) are different:
                    765: - *
                    766: - *    additional ppushes are no problem, since they save the
                    767: - *    proper state information via the normal route
                    768: - *
                    769: - *    additional ppops however would lose the procstacked info
                    770: - *    that info is stored in the CUBE structure so that when
                    771: - *    a ppop from freeze() is undone in unfreeze()
                    772: - *    the proper state information can be restored onto the procstack
                    773: - */
                    774: -
                    775: - struct CUBE {
                    776: -      short poporpush;
                    777: -      short which;
                    778: -      short procsaved;
                    779: -      short transfsaved;
                    780: -
                    781: -      struct VARPARS  *varparsaved;   /* parameter map and local var map */
                    782: -
                    783: -      struct CUBE *pntr;
                    784: -      struct CUBE *rtnp;
                    785: - };
                    786: -
                    787: - struct FREEZE {
                    788: -      short lastsav;
                    789: -      short *statsaved;               /* save states of tables */
                    790: -      short *varsaved;                /* save global variables */
                    791: -      short whichvar;                 /* set if a var changed */
                    792: -      short oldvalue;                 /* of that loc var      */
                    793: -
                    794: -      struct CUBE *cube;              /* place to save stackframe */
                    795: - };
                    796: -
                    797: - struct Swiffle {
                    798: -      struct STATE *st;
                    799: -      struct VISIT *vi;
                    800: -      struct Swiffle *next;
                    801: -      struct Swiffle *last;
                    802: - };
                    803: //GO.SYSIN DD trace.d
                    804: echo trace.expr.c 1>&2
                    805: sed 's/.//' >trace.expr.c <<'//GO.SYSIN DD trace.expr.c'
                    806: -#include <stdio.h>
                    807: -#include <math.h>
                    808: -#include "trace.h"
                    809: -#include "trace.d"
                    810: -
                    811: -#define DEBUG 0
                    812: -
                    813: -#define setv   1
                    814: -#define addeq  2
                    815: -#define subeq  3
                    816: -#define muleq  4
                    817: -#define diveq  5
                    818: -#define modeq  6
                    819: -#define plus   7
                    820: -#define minus  8
                    821: -#define times  9
                    822: -#define div   10
                    823: -#define mod   11
                    824: -#define power 12
                    825: -#define uminus        13
                    826: -#define gt    14
                    827: -#define lt    15
                    828: -#define ge    16
                    829: -#define le    17
                    830: -#define eq    18
                    831: -#define ne    19
                    832: -#define land  20
                    833: -#define lor   21
                    834: -#define lnot  22
                    835: -#define princ 23
                    836: -#define prdec 24
                    837: -#define poinc 25
                    838: -#define podec 26
                    839: -
                    840: -#define OP    0
                    841: -#define NM    1
                    842: -
                    843: -#define unary(c)      (c == uminus || c == lnot || c >= princ)
                    844: -#define binary(c)     !unary(c)
                    845: -
                    846: - extern struct REVPOL **expr;
                    847: - extern int nexpr, nrvars, *globvars;
                    848: - extern struct VARPARS *procpars;
                    849: -
                    850: - struct REVPOL *rev;
                    851: - int curproc, revp;
                    852: -
                    853: - struct {
                    854: -      char how;
                    855: -      short whichvar;
                    856: -      short oldvalue;
                    857: - } storewhere;
                    858: -
                    859: -evalexpr(n, pr, b)
                    860: -      struct FREEZE *b;
                    861: -{ int i;
                    862: -      if (n == NONE)
                    863: -              return 0;
                    864: -      if (n < 0 || n >= nexpr)
                    865: -              whoops("unknown expression");
                    866: -
                    867: -      rev = expr[n];
                    868: -      revp = 0;
                    869: -      curproc = pr;
                    870: -      storewhere.how = 0;
                    871: -
                    872: -      if ((i = getval()) < 0)
                    873: -              i += 3*MANY;
                    874: -      else
                    875: -              i -= 3*MANY;    /* should return stripped constant */
                    876: -#if DEBUG
                    877: -      fprintf(stderr, "evaluated expr %d, process %d, result %d\n", n, pr, i);
                    878: -#endif
                    879: -
                    880: -      b->whichvar = storewhere.whichvar;
                    881: -      b->oldvalue = storewhere.oldvalue;
                    882: -
                    883: -      return storewhere.how;
                    884: -}
                    885: -
                    886: -evalcond(n, pr)
                    887: -{ int i;
                    888: -      if (n < 0 || n >= nexpr)
                    889: -      {       fprintf(stderr, "%d\n", n);
                    890: -              whoops("unknown expression - evalcond");
                    891: -      }
                    892: -
                    893: -      rev = expr[n];
                    894: -      revp = 0;
                    895: -      curproc = pr;
                    896: -      storewhere.how = 0;
                    897: -
                    898: -      if ((i = getval()) < 0)
                    899: -              i += 3*MANY;
                    900: -      else
                    901: -              i -= 3*MANY;    /* should return stripped constant */
                    902: -#if DEBUG
                    903: -      fprintf(stderr, "evaluated cond %d, process %d, result %d\n", n, pr, i);
                    904: -#endif
                    905: -      if (storewhere.how != 0)
                    906: -              whoops("illegal assignment in expression");
                    907: -
                    908: -      return i;
                    909: -}
                    910: -
                    911: -unoper(c, n)
                    912: -{ int i = convert(n, curproc);
                    913: -      switch (c)
                    914: -      {       case uminus:    return (-i);
                    915: -              case lnot  :    return (!i);
                    916: -              case princ :    remem(n); setvar(n, i+1); return i;
                    917: -              case prdec :    remem(n); setvar(n, i-1); return i;
                    918: -              case poinc :    remem(n); return setvar(n, i+1);
                    919: -              case podec :    remem(n); return setvar(n, i-1);
                    920: -              default    :    whoops("unknown unary operator");
                    921: -      }
                    922: -}
                    923: -
                    924: -bioper(c, n, m)       
                    925: -{ int i, j;
                    926: -  double a, b;
                    927: -
                    928: -      if (c != setv)
                    929: -              i = convert(n, curproc);
                    930: -      j = convert(m, curproc);
                    931: -      switch (c)
                    932: -      {       case setv:      remem(n); return setvar(n, j);
                    933: -              case addeq:     remem(n); return setvar(n, i+j);
                    934: -              case subeq:     remem(n); return setvar(n, i-j);
                    935: -              case muleq:     remem(n); return setvar(n, i*j);
                    936: -              case diveq:     remem(n); return setvar(n, i/j);
                    937: -              case modeq:     remem(n); return setvar(n, i%j);
                    938: -              case plus:      return (i+j);
                    939: -              case minus:     return (i-j);
                    940: -              case times:     return (i*j);
                    941: -              case div:       return (i/j);
                    942: -              case mod:       return (i%j);
                    943: -              case gt :       return (i>j);
                    944: -              case lt :       return (i<j);
                    945: -              case ge :       return (i>=j);
                    946: -              case le :       return (i<=j);
                    947: -              case eq :       return (i==j);
                    948: -              case ne :       return (i!=j);
                    949: -              case land:      return (i&&j);
                    950: -              case lor:       return (i||j);
                    951: -              default:        whoops("unkown binary operator");
                    952: -      }
                    953: -}
                    954: -
                    955: -getval()
                    956: -{ int tok = revp++;
                    957: -  int res;
                    958: -
                    959: -      if (rev[tok].toktyp == NM)
                    960: -              res = rev[tok].tokval;
                    961: -      else
                    962: -      {       if (unary(rev[tok].tokval))
                    963: -                      res = unoper(rev[tok].tokval, getval());
                    964: -              else
                    965: -                      res = bioper(rev[tok].tokval, getval(), getval());
                    966: -
                    967: -              if (res < 0)
                    968: -                      res -= 3*MANY;
                    969: -              else
                    970: -                      res += 3*MANY;
                    971: -      }
                    972: -
                    973: -      return res;
                    974: -}
                    975: -
                    976: -setvar(which, v)
                    977: -{ int u = wapper(which, curproc);
                    978: -  int towhat = v;
                    979: -
                    980: -      if (u >= 2*MANY || u < 0)
                    981: -              whoops("lhs of assignment not a variable");
                    982: -
                    983: -      if (u < MANY)
                    984: -      {       if (u >= nrvars)
                    985: -              {       fprintf(stderr, "setvar %d %d %d\n", which, v, u);
                    986: -                      whoops("illegal assignment");
                    987: -              }
                    988: -
                    989: -              globvars[u] = (short) towhat;
                    990: -      }
                    991: -      else
                    992: -      {       u -= MANY;
                    993: -              if (u >= (int) procpars[curproc].nrlvars)
                    994: -                      whoops("unknown local variable");
                    995: -              procpars[curproc].lvarvals[u]  = (short) towhat;
                    996: -      }
                    997: -
                    998: -      return towhat;
                    999: -}
                   1000: -
                   1001: -remem(u)
                   1002: -{     if (storewhere.how != 0)
                   1003: -              whoops("multiple assignment in expression");
                   1004: -
                   1005: -      if (u < MANY)
                   1006: -      {
                   1007: -#if DEBUG
                   1008: -      fprintf(stderr, "setting global %d\n", u);
                   1009: -#endif
                   1010: -              storewhere.whichvar = (short) u;
                   1011: -              storewhere.oldvalue = globvars[u];
                   1012: -              storewhere.how = GV;
                   1013: -      }
                   1014: -      else
                   1015: -      {       storewhere.whichvar = (short) u;
                   1016: -
                   1017: -              u -= MANY;
                   1018: -#if DEBUG
                   1019: -      fprintf(stderr, "setting local %d\n", u);
                   1020: -#endif
                   1021: -              storewhere.oldvalue = procpars[curproc].lvarvals[u];
                   1022: -              storewhere.how = LV;
                   1023: -      }
                   1024: -}
                   1025: //GO.SYSIN DD trace.expr.c
                   1026: echo trace.h 1>&2
                   1027: sed 's/.//' >trace.h <<'//GO.SYSIN DD trace.h'
                   1028: -#define NONE  -1
                   1029: -#define MAXPROC       16
                   1030: -#define PLENTY        16              /* max namelength */
                   1031: -
                   1032: -#define MANY  512             /* range globals: 0 - MANY          */
                   1033: -                              /* range locals : MANY - 2*MANY     */
                   1034: -                              /* range params : 2*MANY and 3*MANY */
                   1035: -                              /* range constants: 3*MANY++ or 3*MANY-- */
                   1036: -
                   1037: -                              /* `column types:'       */
                   1038: -#define INP   10              /* recv specific message */
                   1039: -#define DFL   11              /* default input from q  */
                   1040: -#define TMO   12              /* transition on timeout */
                   1041: -#define OUTP  13              /* append message to a q */
                   1042: -#define SPN   14              /* builtin call or transit state */
                   1043: -#define CND   15              /* conditional   */
                   1044: -#define FCT   16              /* function call */
                   1045: -
                   1046: -#define INCR  16              /* increment a sequence number       */
                   1047: -#define DECR  17              /* decrement a sequence number       */
                   1048: -#define SUBT  18              /* subtract    */
                   1049: -#define ADDT  19              /* add         */
                   1050: -#define SETV  32              /* set seq. number to initial value  */
                   1051: -#define ISEQ  256             /* compare two variables (s.numbers) */
                   1052: -#define NTEQ  257             /* != */
                   1053: -#define GREQ  258             /* >= */
                   1054: -#define SMEQ  259             /* <= */
                   1055: -#define GRNQ  260             /* >  */
                   1056: -#define SMNQ  261             /* <  */
                   1057: -
                   1058: -#define POP   1
                   1059: -#define PUSH  -1
                   1060: -
                   1061: -#define SO    2       /* send only    */
                   1062: -#define RO    4       /* recv only    */
                   1063: -#define SR    6       /* send & recv  */
                   1064: -#define TC    8       /* reftask call */
                   1065: -#define TO    16      /* timeout      */
                   1066: -#define LV    32      /* local  var updated */
                   1067: -#define GV    64      /* global var updated */
                   1068: -
                   1069: -#define FAIL  -1      /* backward receive: cargo mismatch */
                   1070: -
                   1071: -#define NOREF(i)      (i < 0 || i >= MAXPROC)
                   1072: -#define NOTOOBIG      16383   /* was  32767 */
                   1073: //GO.SYSIN DD trace.h
                   1074: echo trace1.c 1>&2
                   1075: sed 's/.//' >trace1.c <<'//GO.SYSIN DD trace1.c'
                   1076: -#include <stdio.h>
                   1077: -#include <signal.h>
                   1078: -#include "trace.h"
                   1079: -#include "trace.d"
                   1080: -
                   1081: -#if 0
                   1082: -#define debug(s1, s2, s3, s4, s5)     printf(s1, s2, s3, s4, s5)
                   1083: -#else
                   1084: -#define debug(s1, s2, s3, s4, s5)     
                   1085: -#endif
                   1086: -
                   1087: - struct TBL       *tbl;
                   1088: - struct LBT     *lbt;
                   1089: - struct MBOX      *mbox;
                   1090: - struct MNAME     *fullname;
                   1091: -
                   1092: - struct REVPOL **expr;
                   1093: - struct PROCSTACK **procstack;
                   1094: -
                   1095: - struct VARPARS         *procpars;
                   1096: - struct TBLPARS         *tblpars;
                   1097: - struct LOCVARS   *tblvars;
                   1098: - struct TBLPARS   *tablpars;
                   1099: -
                   1100: - struct QUEUE     **starter, **head, **tail;
                   1101: - struct QUEUE     *s_first, *s_last;
                   1102: -
                   1103: -/*
                   1104: - * reftasks : mapping of logic reftask id to table number
                   1105: - * processes: mapping of logic process id to table number
                   1106: - * basics   : initial process table
                   1107: - */
                   1108: -
                   1109: - int *state, *reftasks, *processes, *basics;
                   1110: - int *qsize, *globvars, *inits, *xob;
                   1111: -
                   1112: - /*
                   1113: -  * the state-set of an assertion table is mapped
                   1114: -  * onto the global variables (to simplify state checking)
                   1115: -  * the first global that is an element from the state set
                   1116: -  * is given by integer `abase'
                   1117: -  */
                   1118: -
                   1119: - int abase = -1;              /* base of assertion table state set */
                   1120: - int ebase = -1;              /* base of error table state set */
                   1121: - int assertbl = -1;           /* table used for assertion checking */
                   1122: - int errortbl = -1;           /* table used for assertion checking */
                   1123: - int msgbase = -1, maxlevel = -1, maxreached = -1;
                   1124: -
                   1125: - int maxcol=0, nrtbl=0, nrqs=0, nrprocs=0, nrrefs=0;
                   1126: - int nrinit=0, nrvars=0, nexpr=0, nrmesgs=0, linecode=0;
                   1127: - int QMAX=2;
                   1128: -
                   1129: - char qoverride = 0;
                   1130: - char noshortcut = 0;         /* disable timeout heuristics */
                   1131: - char prbyq = 2;              /* controls output format     */
                   1132: - char blast = 0;              /* blast search mode   */
                   1133: - char qandirty = 0;           /* scatter search mode */
                   1134: - char lockplus = 0;           /* report both buffer locks and loops */
                   1135: - char firstlock = 0;          /* stop at first buffer lock found    */
                   1136: - char maxxed = 0;             /* bound on search depth  */
                   1137: - char prefix = 0;             /* print all prefixes too */
                   1138: - char timedd = 0;             /* verbose mode    */
                   1139: - char completed = 0;          /* not interrupted */
                   1140: - char muststore = 0;          /* must perform loop check and store state */
                   1141: - char sensible = 0;           /* default mode: try a sensible partial search */
                   1142: -
                   1143: - double zapper = (double) 30000;
                   1144: - double tryswiff=0, noswiff=0, cannot=0;
                   1145: -
                   1146: - long zapped = 0, locksf = 0, loopsf = 0;
                   1147: - long normf = 0, callno = 0;
                   1148: -
                   1149: - int *effnrstates;    /* effective nr of table states per process */
                   1150: - int aperiod = 120;
                   1151: -
                   1152: - char *topofmem, *sbrk(), *Smalloc();
                   1153: - char fname[64];
                   1154: -
                   1155: - FILE *mb;
                   1156: -
                   1157: - extern double iseen, ireseen, painful, kurshan;
                   1158: -
                   1159: -onalarm()
                   1160: -{     float t;
                   1161: -      struct { long u, p, cu, cp; } tim;
                   1162: -
                   1163: -      times(&tim);
                   1164: -      t = (float) (tim.u  + tim.p)/ (float) 60.0;
                   1165: -
                   1166: -      if (++callno%10 == 1)
                   1167: -      {       fprintf(stderr, " seconds  depth  states   zapped");
                   1168: -              fprintf(stderr, "  prefix terms loops locks   memory\n");
                   1169: -      }
                   1170: -      fprintf(stderr, "%8.2f %6d ", t, maxreached);
                   1171: -      fprintf(stderr, "%6g %8ld %7g ", iseen+ireseen, zapped, kurshan);
                   1172: -      fprintf(stderr, "%5ld %5ld ", normf, loopsf);
                   1173: -      fprintf(stderr, "%5ld %8u\n", locksf, sbrk(0) - topofmem);
                   1174: -      signal(SIGALRM, onalarm);
                   1175: -      alarm(aperiod);
                   1176: -}
                   1177: -
                   1178: -postlude()
                   1179: -{     struct { long u, p, cu, cp; } tim;
                   1180: -      extern double COUNT;
                   1181: -      float u, s;
                   1182: -
                   1183: -      fflush(stdout);
                   1184: -      if (!completed)
                   1185: -              fprintf(stderr, "trace: interrupted\n");
                   1186: -
                   1187: -      if (timedd)
                   1188: -      {       times(&tim);
                   1189: -              u = (float) tim.u / (float) 60.0;
                   1190: -              s = (float) tim.p / (float) 60.0;
                   1191: -
                   1192: -              fprintf(stderr, "\ttime: %.2fs u + ", u);
                   1193: -              fprintf(stderr, "%.2fs sys = %.2fs\n\n", s, u+s);
                   1194: -              fprintf(stderr, "\t%g states cached, ", iseen+ireseen);
                   1195: -              fprintf(stderr, "%ld states zapped\n",  zapped);
                   1196: -              fprintf(stderr, "\tsearch depth reached: %d; ", maxreached);
                   1197: -              fprintf(stderr, "memory used: %u\n\t", sbrk(0) - topofmem );
                   1198: -              fprintf(stderr, "%ld deadlocks, ", locksf);
                   1199: -              fprintf(stderr, "%ld loops, ", loopsf);
                   1200: -              fprintf(stderr, "%ld terminating executions, and ", normf);
                   1201: -              fprintf(stderr, "%g prefixes\n", kurshan);
                   1202: -              fprintf(stderr, "\t%g edges traversed", COUNT);
                   1203: -              fprintf(stderr, ", %g states analyzed twice\n", painful);
                   1204: -              if (cannot > 0)
                   1205: -              fprintf(stderr, "\t%g cache replacements failed\n", cannot);
                   1206: -              if (tryswiff > 0)
                   1207: -              fprintf(stderr, "\ttryswiff  %5g noswiff  %g\n",tryswiff,noswiff);
                   1208: -      }
                   1209: -      exit(completed == 0);
                   1210: -}
                   1211: -
                   1212: -wisdom()
                   1213: -{
                   1214: -      if (sensible)
                   1215: -      {       timedd = firstlock = qandirty = 1;
                   1216: -              fprintf(stderr, "default search: ");
                   1217: -              fprintf(stderr, "-vxjqm %d %d\n", QMAX, maxlevel);
                   1218: -      } else
                   1219: -      {       fprintf(stderr, "%s search, ", (blast) ? "blast" :
                   1220: -                                      (qandirty) ? "scatter" : "exhaustive");
                   1221: -              fprintf(stderr, "depth bound %d\n", maxlevel);
                   1222: -      }
                   1223: -}
                   1224: -
                   1225: -main(argc, argv)
                   1226: -      char **argv;
                   1227: -{
                   1228: -      char c;
                   1229: -      int  i=1, j, base=2;
                   1230: -
                   1231: -      strcpy(fname, "pret.out");
                   1232: -      if (argc > 1 && argv[1][0] == '-')
                   1233: -      {       base++;
                   1234: -              while ((c = argv[1][i++]) != '\0')
                   1235: -                      switch (c) {
                   1236: -                      case 'a': prefix = 1;   break;
                   1237: -                      case 'b': blast = qandirty = 1; break;
                   1238: -                      case 'c': if (argc >= base)
                   1239: -                                {     sscanf(argv[base-1], "%d", &j);
                   1240: -                                      base++;
                   1241: -                                } else
                   1242: -                                      usage("missing argument for `c' flag");
                   1243: -                                firstlock = lockplus = timedd = 1;
                   1244: -                                switch (j) {
                   1245: -                                      case 0: blast = qandirty = 1; break;
                   1246: -                                      case 1: maxxed = 3;     /* fall through */
                   1247: -                                      case 2: qandirty = 1; break;
                   1248: -                                      case 3: maxxed = 2; break; /* 1{ x effnr */
                   1249: -                                      case 4: maxxed = 3;        /* 2 x effnr  */
                   1250: -                                      case 5: break;             /* 8 x effnr  */
                   1251: -                                      default: usage("unknown validation class");
                   1252: -                                }
                   1253: -                                break;
                   1254: -                      case 'f': prbyq = 1; break;
                   1255: -                      case 'F': prbyq = 0; break;
                   1256: -                      case 'j': firstlock = 1; break;
                   1257: -                      case 'k': if (argc >= base)
                   1258: -                                {     sscanf(argv[base-1], "%d", &j);
                   1259: -                                      zapper = (double) (j * 1000);
                   1260: -                                      base++;
                   1261: -                                } else
                   1262: -                                      usage("missing argument for `k' flag");
                   1263: -                                break;
                   1264: -                      case 'l': lockplus = 1; break;
                   1265: -                      case 'm': maxxed = 1;
                   1266: -                                if (argc >= base)
                   1267: -                                {     sscanf(argv[base-1], "%d", &maxlevel);
                   1268: -                                      base++;
                   1269: -                                } else
                   1270: -                                      usage("missing argument for `m' flag");
                   1271: -                                break;
                   1272: -                      case 'n': noshortcut = 1; break;
                   1273: -                      case 'q': qoverride = 1;
                   1274: -                                if (argc >= base)
                   1275: -                                {     sscanf(argv[base-1], "%d", &QMAX);
                   1276: -                                      base++;
                   1277: -                                } else
                   1278: -                                      usage("missing argument for `q' flag");
                   1279: -                                break;
                   1280: -                      case 'r': if (argc >= base)
                   1281: -                                {     sscanf(argv[base-1], "%d", &j);
                   1282: -                                      base++;
                   1283: -                                } else
                   1284: -                                      usage("missing argument for `r' flag");
                   1285: -                                signal(SIGALRM, postlude);
                   1286: -                                aperiod = 0;
                   1287: -                                alarm(j*60);
                   1288: -                                break;
                   1289: -                      case 'R': if (argc >= base)
                   1290: -                                {     sscanf(argv[base-1], "%d", &j);
                   1291: -                                      base++;
                   1292: -                                } else
                   1293: -                                      usage("missing argument for `R' flag");
                   1294: -                                aperiod = j*60;
                   1295: -                                break;
                   1296: -                      case 's': setup(); showtables(timedd); exit(0);
                   1297: -                                break;
                   1298: -                      case 'v': timedd = 1;   break;
                   1299: -                      case 'x': qandirty = 1; break;
                   1300: -                      default : usage("unknown option");
                   1301: -                      }
                   1302: -      } else
                   1303: -      {       sensible = qoverride = 1;
                   1304: -      }
                   1305: -
                   1306: -      if (argc >= base-1)
                   1307: -              sscanf(argv[base-1], "%s", fname);
                   1308: -      else
                   1309: -              strcpy(fname, "pret.out");
                   1310: -
                   1311: -      setup();
                   1312: -      init();
                   1313: -      topofmem = sbrk(0);
                   1314: -
                   1315: -      if (maxxed != 1)
                   1316: -      {
                   1317: -              for (j = maxlevel = 0; j < nrprocs; j++)
                   1318: -                      maxlevel += effnrstates[processes[j]];
                   1319: -
                   1320: -              switch (maxxed) {
                   1321: -                      case 3: maxlevel *= 2; break;
                   1322: -                      case 2: maxlevel = (3*maxlevel)/2; break;
                   1323: -                      case 0: if (sensible)
                   1324: -                                      maxlevel *= 2;
                   1325: -                              else
                   1326: -                                      maxlevel *= 8;  /* avoid pathetic cases */
                   1327: -                              break;
                   1328: -                      default: whoops("cannot happen - main");
                   1329: -              }
                   1330: -              maxxed = 1;
                   1331: -      }
                   1332: -      if (aperiod > 0)
                   1333: -      {       signal(SIGALRM, onalarm);
                   1334: -              alarm(aperiod);
                   1335: -      } signal(SIGINT, postlude);
                   1336: -
                   1337: -      wisdom();
                   1338: -      muststore = 1;  /* must always store initial state */
                   1339: -      FSE(0);
                   1340: -      completed = 1;
                   1341: -      postlude();
                   1342: -}
                   1343: -
                   1344: -setup()
                   1345: -{
                   1346: -      if ((mb = fopen(fname, "r")) == NULL)
                   1347: -      {       fprintf(stderr, "cannot find `%s'\n", fname);
                   1348: -              exit(1);
                   1349: -      }
                   1350: -
                   1351: -      getglobals();
                   1352: -      gettables();
                   1353: -      getexprs();
                   1354: -
                   1355: -      fclose(mb);
                   1356: -}
                   1357: -
                   1358: -getglobals()
                   1359: -{ register int i, j;
                   1360: -  int a, b, c, x, y, z;
                   1361: -
                   1362: -      if (fscanf(mb, "%d linecode\n", &linecode) != 1)
                   1363: -              badinput("linecode");
                   1364: -      a = fscanf(mb, "%d procedures (assert %d/%d)\n", &x, &assertbl, &errortbl);
                   1365: -      if (a != 3)
                   1366: -              badinput("procedures");
                   1367: -      if (fscanf(mb, "%d processes\n", &y) != 1)
                   1368: -              badinput("processes");
                   1369: -      if (fscanf(mb, "%d queues:\n", &z) != 1)
                   1370: -              badinput("queues");
                   1371: -
                   1372: -      debug("%d procs, %d functions, %d queues, assert %d\n", y, x, z, assertbl);
                   1373: -
                   1374: -      nrtbl = x + y;
                   1375: -      nrqs = z;
                   1376: -      alloc1(x, y, z);
                   1377: -
                   1378: -      getmesnames();
                   1379: -
                   1380: -      for (i = 0; i < z; i++)
                   1381: -      {       if (fscanf(mb, "%s\t%d/%d/%d: ", mbox[i].qname, &b, &a, &c) != 4)
                   1382: -                      badinput("queue sorts");
                   1383: -              alloc2(i, a, b);
                   1384: -              for (j = 0; j < c; j++)
                   1385: -              {       fscanf(mb, "%d,", &b);
                   1386: -                      xob[b] = i;
                   1387: -              }
                   1388: -      }
                   1389: -
                   1390: -      if (fscanf(mb, "%d inits:\n", &nrinit) != 1)
                   1391: -              badinput("queue inits");
                   1392: -
                   1393: -      alloc3(nrinit);
                   1394: -      for (i = 0; i < nrinit; i++)
                   1395: -              fscanf(mb, "%d,", &(inits[i]));
                   1396: -
                   1397: -      if (fscanf(mb, "%d g-variables: ", &nrvars) != 1)
                   1398: -              badinput("g-variables");
                   1399: -
                   1400: -      alloc4(nrvars);
                   1401: -
                   1402: -      for (i = 0; i < nrvars; i++)
                   1403: -              if (fscanf(mb, "%d,", &a) != 1)
                   1404: -                      badinput("g-var-inits");
                   1405: -              else
                   1406: -              {       if ((b = determine(a)) == 1 || b == 2)
                   1407: -                              badinput("g-var bad init");
                   1408: -                      else
                   1409: -                              globvars[i] = (short) a;
                   1410: -              }
                   1411: -}
                   1412: -
                   1413: -getmesnames()
                   1414: -{ register int i;
                   1415: -      if (fscanf(mb, "%d messages, base %d:\n", &nrmesgs, &msgbase) != 2)
                   1416: -              badinput("messages");
                   1417: -
                   1418: -      alloc45(nrmesgs);
                   1419: -
                   1420: -      for (i = 0; i < nrmesgs; i++)
                   1421: -              if (fscanf(mb, "%s ", fullname[i].mname) != 1)
                   1422: -                      badinput("mesg");
                   1423: -}
                   1424: -
                   1425: -gettables()
                   1426: -{ register int i, j;
                   1427: -  int a, b, c, d;
                   1428: -  char name[32];
                   1429: -
                   1430: -      processes[0] = -1;
                   1431: -      if (nrtbl >= 64)
                   1432: -              badinput("too many process tables...");
                   1433: -      for (i = 0; i < nrtbl; i++)
                   1434: -      {       if ((j = fscanf(mb, "%s %d:%d/%d:", name, &a, &b, &c)) != 4)
                   1435: -              {       printf("matched %d: %s %d\n", j, name, a);
                   1436: -                      badinput("table header");
                   1437: -              }
                   1438: -
                   1439: -              debug("table %d: %s (%d) ", i, name, a, 0);
                   1440: -              debug("r/c: %d/%d\n", b, c, 0, 0);
                   1441: -
                   1442: -              if (b >= 1024)
                   1443: -                      badinput("too many states");
                   1444: -              if ((tbl[i].nrrows = b) == 0)
                   1445: -                      badinput("empty table");
                   1446: -              tbl[i].nrcols = c;
                   1447: -
                   1448: -              if (strcmp(name, "REF") == 0)
                   1449: -              {       reftasks[a] = i;
                   1450: -                      nrrefs++;
                   1451: -              } else
                   1452: -              {       processes[a] = basics[a] = i;
                   1453: -                      nrprocs++;
                   1454: -                      effnrstates[i] = b;
                   1455: -              }
                   1456: -
                   1457: -              if (b > 0)
                   1458: -              {       alloc5(i);
                   1459: -                      for (j = 0; j < c; j++)
                   1460: -                      {       if (fscanf(mb, "%d(%d),", &b, &d) != 2)
                   1461: -                                      badinput("column header");
                   1462: -
                   1463: -                              debug("%d(%d),\n", b, d, 0, 0);
                   1464: -
                   1465: -                              tbl[i].coltyp[j] = d;
                   1466: -                              tbl[i].colmap[j] = b;
                   1467: -                              if (d != FCT && d != SPN && d != CND)
                   1468: -                                      tbl[i].colorg[j] = whichq(b);
                   1469: -                              else
                   1470: -                                      tbl[i].colorg[j] = -1;
                   1471: -                      }
                   1472: -                      getrows(i);
                   1473: -                      getspecials(i);
                   1474: -                      getcalls(i);
                   1475: -                      getparams(a, i);
                   1476: -                      getlocvars(a, i);
                   1477: -}     }       }
                   1478: -
                   1479: -getrows(nn)
                   1480: -{ int a, b, c;
                   1481: -  int n = nn;
                   1482: -  char tmp[128];
                   1483: -
                   1484: -      for (;;)
                   1485: -      {       if (fscanf(mb, "%d/%d (%d) ", &a, &b, &c) != 3)
                   1486: -                      badinput("row");
                   1487: -
                   1488: -              if (a == 0 && b == 0 && c == 0)
                   1489: -                      break;
                   1490: -
                   1491: -              debug("row %d, col %d, size %d:\n", a, b, c, 0);
                   1492: -
                   1493: -              if (c == 0)
                   1494: -                      continue;
                   1495: -
                   1496: -              tbl[n].deadrow[a] = 0;
                   1497: -              getentries(n, a, b, c);
                   1498: -      }
                   1499: -      if (!linecode) return;
                   1500: -
                   1501: -      if (fscanf(mb, "%s\n", tmp) != 1 || strcmp(tmp, "rownames:") != 0)
                   1502: -              badinput("rownames");
                   1503: -      for (a = 0; a < tbl[n].nrrows; a++)
                   1504: -      {       for (b = 0; (tbl[n].rowname[a][b] = getc(mb)) != '\n'; b++) ;
                   1505: -              tbl[n].rowname[a][b] = '\0';
                   1506: -      }
                   1507: -}
                   1508: -
                   1509: -getentries(nn, m, p, q)
                   1510: -{ register int i;
                   1511: -  int x, y, n = nn;
                   1512: -
                   1513: -      tbl[n].ptr[m][p].nrpils = (short) q;
                   1514: -
                   1515: -      alloc6(n, m, p, q);
                   1516: -
                   1517: -      for (i = 0; i < q; i++)
                   1518: -      {       if (fscanf(mb, "[%d,%d] ", &x, &y) != 2)
                   1519: -                      badinput("table entry");
                   1520: -              tbl[n].ptr[m][p].one[i].transf   = (short) x;
                   1521: -              tbl[n].ptr[m][p].one[i].valtrans = (short) y;
                   1522: -
                   1523: -              debug("\t[%d,%d] \n", x, y, 0, 0);
                   1524: -      }
                   1525: -}
                   1526: -
                   1527: -getspecials(in)
                   1528: -{ register int i;
                   1529: -  int n, m;
                   1530: -  char stri[64];
                   1531: -      if (fscanf(mb, "ENDSTATES %d: ", &n) != 1)
                   1532: -              badinput("endstates");
                   1533: -
                   1534: -      for (i = 0; i < n; i++)
                   1535: -      {       if (fscanf(mb, "%d,", &m) != 1 || m < 0 || m >= tbl[in].nrrows)
                   1536: -                      badinput("endstate");
                   1537: -              tbl[in].endrow[m] = 1;
                   1538: -      }
                   1539: -      if ((m = fscanf(mb, "%s %d: ", stri, &n)) != 2 ||
                   1540: -              strcmp(stri, "BADSTATES") != 0)
                   1541: -      {       printf("read %s %d\n", stri, n);
                   1542: -              badinput("badstates");
                   1543: -      }
                   1544: -
                   1545: -      for (i = 0; i < n; i++)
                   1546: -      {       if (fscanf(mb, "%d,", &m) != 1 || m < 0 || m >= tbl[in].nrrows)
                   1547: -                      badinput("badstate");
                   1548: -              tbl[in].badrow[m] = 1;
                   1549: -      }
                   1550: -
                   1551: -      if ((m = fscanf(mb, "%s %d: ", stri, &n)) != 2 ||
                   1552: -              strcmp(stri, "LABSTATES") != 0)
                   1553: -      {       printf("read %s %d\n", stri, n);
                   1554: -              badinput("labstates");
                   1555: -      }
                   1556: -
                   1557: -      for (i = 0; i < n; i++)
                   1558: -      {       if (fscanf(mb, "%d,", &m) != 1 || m < 0 || m >= tbl[in].nrrows)
                   1559: -                      badinput("labstate");
                   1560: -              tbl[in].labrow[m] = 1;
                   1561: -      }
                   1562: -      debug("specials:\n", 0, 0, 0, 0);
                   1563: -      for (i = 0; i < tbl[in].nrrows; i++)
                   1564: -      {       n = tbl[in].endrow[i];
                   1565: -              m = tbl[in].badrow[i];
                   1566: -              debug("\t%d: %d/%d/%d\n", i, n, m, tbl[in].labrow[i]);
                   1567: -      }
                   1568: -}
                   1569: -
                   1570: -getparams(pr, tb)
                   1571: -{ int  n, m;
                   1572: -  char stri[64];
                   1573: -      if (fscanf(mb, "%s %d/%d", stri, &n, &m) != 3)
                   1574: -      {       printf("read %s %d/%d\n", stri, n, m);
                   1575: -              badinput("parameters");
                   1576: -      }
                   1577: -
                   1578: -      tblpars[tb].nrms = (short) n;           /* required sizes  */
                   1579: -      tblpars[tb].nrvs = (short) m;
                   1580: -
                   1581: -      if (processes[pr] == tb)
                   1582: -              alloc8(pr, 2*n, 2*m);           /* avalaible sizes */
                   1583: -}
                   1584: -
                   1585: -getlocvars(p, tb)
                   1586: -{ register int i;
                   1587: -  int n, m;
                   1588: -      if (fscanf(mb, "%d l-variables: ", &n) != 1)
                   1589: -              badinput("l-variables");
                   1590: -
                   1591: -      if (processes[p] != tb)
                   1592: -      {       tblvars[tb].nrlvars = (short) n;        /* required size */
                   1593: -              if (n > 0)
                   1594: -                      tblvars[tb].lvarvals = (short *)
                   1595: -                              Smalloc(n * sizeof(short));
                   1596: -              for (i = 0; i < n; i++)
                   1597: -                      if (fscanf(mb, "%d,", &m) != 1)
                   1598: -                              badinput("l-vars");
                   1599: -                      else
                   1600: -                              tblvars[tb].lvarvals[i] = (short) m;
                   1601: -      } else
                   1602: -      {       tablpars[p].nrlvars = (short) (2*n);    /* available size */
                   1603: -              procpars[p].nrlvars = (short) n;        /* actually used  */
                   1604: -              if (n > 0)
                   1605: -                      procpars[p].lvarvals = (short *)
                   1606: -                              Emalloc((2*n) * sizeof(short));
                   1607: -              for (i = 0; i < n; i++)
                   1608: -                      if (fscanf(mb, "%d,", &m) != 1)
                   1609: -                              badinput("lvar-inits");
                   1610: -                      else
                   1611: -                              procpars[p].lvarvals[i] = (short) m;
                   1612: -      }
                   1613: -}
                   1614: -
                   1615: -getcalls(in)
                   1616: -{ register int i, j;
                   1617: -  int k, n, m, a, b, N;
                   1618: -  char stri[64];
                   1619: -      if (fscanf(mb, "%s %d", stri, &n) != 2)         /* FCTS */
                   1620: -      {       printf("read %s %d\n", stri, n);
                   1621: -              badinput("function calls");
                   1622: -      }
                   1623: -      alloc9(in, n);
                   1624: -      for (i = 0, N = n; i < N; i++)
                   1625: -      {       if (fscanf(mb, "%d-%d/%d: ", &n, &m, &k) != 3)
                   1626: -                      badinput("fct call");
                   1627: -
                   1628: -              alloc10(in, i, n, m, k);
                   1629: -
                   1630: -              effnrstates[in] += tbl[reftasks[n]].nrrows;
                   1631: -
                   1632: -              for (j = m+k, a = b = 0; j > 0; j--)
                   1633: -              {       if (fscanf(mb, "%d/%d", &n, &m) != 2)
                   1634: -                              badinput("fct call entry");
                   1635: -                      if (n == 0)
                   1636: -                              tbl[in].calls[i].ms[a++] = (short) m;
                   1637: -                      else
                   1638: -                              tbl[in].calls[i].vs[b++] = (short) m;
                   1639: -      }       }
                   1640: -}
                   1641: -
                   1642: -getexprs()
                   1643: -{ int i, j, a, b, c;
                   1644: -  char name[32];
                   1645: -
                   1646: -      if (fscanf(mb, "%s %d\n", name, &nexpr) != 2)
                   1647: -              badinput("nexpr");
                   1648: -      if (strcmp(name, "EXPR") != 0)
                   1649: -              badinput("expressions");
                   1650: -
                   1651: -      expr = (struct REVPOL **)
                   1652: -              Smalloc(nexpr * sizeof(struct REVPOL *));
                   1653: -
                   1654: -      for (i = 0; i < nexpr; i++)
                   1655: -      {       fscanf(mb, "%d: ", &a);
                   1656: -
                   1657: -              expr[i] = (struct REVPOL *)
                   1658: -                      Smalloc(a * sizeof(struct REVPOL));
                   1659: -
                   1660: -              for (j = 0; j < a; j++)
                   1661: -              {       fscanf(mb, "%d/%d: %d\n", &b, &c);
                   1662: -                      expr[i][j].toktyp = b;
                   1663: -                      expr[i][j].tokval = c;
                   1664: -      }       }
                   1665: -}
                   1666: -
                   1667: -showtables(how)
                   1668: -{ register int i, j;
                   1669: -  int k, n, m, p;
                   1670: -  char table[2*MAXPROC][64];
                   1671: -
                   1672: -      for (i = 0; i < nrprocs; i++)
                   1673: -      {       j = processes[i];
                   1674: -              sprintf(table[j], "process %d", i);
                   1675: -      }
                   1676: -      for (i = 0; i < nrrefs; i++)
                   1677: -      {       j = reftasks[i];
                   1678: -              sprintf(table[j], "reftask %d", i);
                   1679: -      }
                   1680: -
                   1681: -      for (i = 0; i < nrtbl; i++)
                   1682: -      {
                   1683: -              printf("\n%s (table %d):\n", table[i], i);
                   1684: -              if (how && linecode)
                   1685: -              {       for (j = 2+strlen(tbl[i].rowname[0]); j > 0; j--)
                   1686: -                              putchar(' ');
                   1687: -              } else  printf("  ");
                   1688: -              putchar('\t');
                   1689: -              for (k = 0; k < tbl[i].nrcols; k++)
                   1690: -              {       switch(tbl[i].coltyp[k]) {
                   1691: -                              case INP:  printf("I:"); break;
                   1692: -                              case DFL:  printf("D:"); break;
                   1693: -                              case TMO:  printf("T:"); break;
                   1694: -                              case OUTP: printf("O:"); break;
                   1695: -                              case SPN:  printf("S:"); break;
                   1696: -                              case CND:  printf("C:"); break;
                   1697: -                              case FCT:  printf("F:"); break;
                   1698: -                      }
                   1699: -                      if (tbl[i].colorg[k] != -1)
                   1700: -                      printf("%d/%d\t", tbl[i].colmap[k], tbl[i].colorg[k]);
                   1701: -                      else
                   1702: -                              printf("%d  \t", tbl[i].colmap[k]);
                   1703: -              }
                   1704: -
                   1705: -              for (j = 0; j < tbl[i].nrrows; j++)
                   1706: -              {       if (!how || !linecode)
                   1707: -                              printf("\n%2d\t", j);
                   1708: -                      else
                   1709: -                              printf("\n%2d/%s\t", j, tbl[i].rowname[j]);
                   1710: -                      for (k = 0; k < tbl[i].nrcols; k++)
                   1711: -                      {       if (how)
                   1712: -                              {
                   1713: -                              for (p = 0; p < tbl[i].ptr[j][k].nrpils; p++)
                   1714: -                              {       n = (int) tbl[i].ptr[j][k].one[p].transf;
                   1715: -                                      printf("%d,", n);
                   1716: -                              }
                   1717: -                              } else
                   1718: -                              {
                   1719: -                              if (tbl[i].ptr[j][k].nrpils > 0)
                   1720: -                              {       n = (int) tbl[i].ptr[j][k].one[0].transf;
                   1721: -                                      m = (int) tbl[i].ptr[j][k].one[0].valtrans;
                   1722: -                                      printf("%d(%d)", n, m);
                   1723: -                              }
                   1724: -                              if (tbl[i].ptr[j][k].nrpils > 1)
                   1725: -                                      putchar('+');
                   1726: -                              }
                   1727: -                              putchar('\t');
                   1728: -                      }
                   1729: -      }       }
                   1730: -      putchar('\n');
                   1731: -}
                   1732: -
                   1733: -whichq(n)
                   1734: -{ int i;
                   1735: -      if (n < 0 || n >= MANY)
                   1736: -              return -1;
                   1737: -
                   1738: -      if ((i = xob[n]) == -1)
                   1739: -              badinput("mbox sort incomplete");
                   1740: -
                   1741: -      return i;
                   1742: -}
                   1743: -
                   1744: -init()
                   1745: -{ register int i, m;
                   1746: -      state = (int *)
                   1747: -              Smalloc(nrprocs * sizeof(int));
                   1748: -      qsize = (int *)
                   1749: -              Smalloc(nrqs * sizeof(int));
                   1750: -      head = (struct QUEUE **)
                   1751: -              Smalloc(nrqs * sizeof(struct QUEUE *));
                   1752: -      tail = (struct QUEUE **)
                   1753: -              Smalloc(nrqs * sizeof(struct QUEUE *));
                   1754: -      starter = (struct QUEUE **)
                   1755: -              Smalloc(nrqs * sizeof(struct QUEUE *));
                   1756: -
                   1757: -
                   1758: -      for (i = 0; i < nrqs; i++)
                   1759: -      {       starter[i] = (struct QUEUE *)
                   1760: -                      Smalloc(sizeof(struct QUEUE));
                   1761: -              starter[i]->next = NULL;
                   1762: -              qsize[i] = 0;
                   1763: -              head[i] = tail[i] = starter[i];
                   1764: -      }
                   1765: -
                   1766: -      decode();
                   1767: -      initable();     /* do not change the order of inits */
                   1768: -      iniqtable();
                   1769: -      inihash();
                   1770: -
                   1771: -      for (i = 0; i < nrprocs; i++)
                   1772: -      {       state[i] = 0;
                   1773: -              procstack[i] = NULL;
                   1774: -
                   1775: -              lbt[i].mapcol = (int *)
                   1776: -                      Smalloc(maxcol * sizeof(int));
                   1777: -              lbt[i].orgcol = (int *)
                   1778: -                      Smalloc(maxcol * sizeof(int));
                   1779: -              fiddler(i);
                   1780: -      }
                   1781: -
                   1782: -      s_last = NULL;
                   1783: -
                   1784: -      for (i = 0; i < nrinit; i++)
                   1785: -      {       m = inits[i];
                   1786: -              if (send(m, whichq(m), NONE, NONE, 0) == 0)
                   1787: -                      badinput("qsize too small for initial string...");
                   1788: -      }
                   1789: -      if (assertbl != NONE)
                   1790: -      {       assertbl = reftasks[assertbl];
                   1791: -
                   1792: -              abase = nrvars;
                   1793: -              nrvars += tbl[assertbl].nrrows;
                   1794: -
                   1795: -              if (abase > 0)
                   1796: -                      globvars = (int *)
                   1797: -                              Realloc(globvars, nrvars * sizeof(int));
                   1798: -              else
                   1799: -                      globvars = (int *)
                   1800: -                              Smalloc(nrvars * sizeof(int));
                   1801: -
                   1802: -              globvars[abase] = 1;
                   1803: -              for (i = abase+1; i < nrvars; i++)
                   1804: -                      globvars[i] = 0;
                   1805: -      }
                   1806: -      if (errortbl != NONE)
                   1807: -      {       errortbl = reftasks[errortbl];
                   1808: -
                   1809: -              ebase = nrvars;
                   1810: -              nrvars += tbl[errortbl].nrrows;
                   1811: -
                   1812: -              if (ebase > 0)
                   1813: -                      globvars = (int *)
                   1814: -                              Realloc(globvars, nrvars * sizeof(int));
                   1815: -              else
                   1816: -                      globvars = (int *)
                   1817: -                              Smalloc(nrvars * sizeof(int));
                   1818: -
                   1819: -              globvars[ebase] = 1;
                   1820: -              for (i = ebase+1; i < nrvars; i++)
                   1821: -                      globvars[i] = 0;
                   1822: -      }
                   1823: -}
                   1824: -
                   1825: -decode()
                   1826: -{ register int i, j, m;
                   1827: -
                   1828: -      for (i = 0; i < nrvars; i++)
                   1829: -      {       m = convert(globvars[i], NONE);
                   1830: -              globvars[i] = (short) m;
                   1831: -      }
                   1832: -      for (i = 0; i < nrprocs; i++)
                   1833: -      for (j = 0; j < procpars[i].nrlvars; j++)
                   1834: -      {       m = convert(procpars[i].lvarvals[j], i);
                   1835: -              procpars[i].lvarvals[j] = (short) m;
                   1836: -      }
                   1837: -}
                   1838: //GO.SYSIN DD trace1.c
                   1839: echo trace2.c 1>&2
                   1840: sed 's/.//' >trace2.c <<'//GO.SYSIN DD trace2.c'
                   1841: -#include <stdio.h>
                   1842: -#include <errno.h>
                   1843: -#include "trace.h"
                   1844: -#include "trace.d"
                   1845: -
                   1846: - extern struct TBL       *tbl;
                   1847: - extern struct LBT     *lbt;
                   1848: - extern struct MBOX      *mbox;
                   1849: - extern struct MNAME     *fullname;
                   1850: - extern struct REVPOL    **expr;
                   1851: - extern struct PROCSTACK **procstack;
                   1852: -
                   1853: - extern struct VARPARS         *procpars;
                   1854: - extern struct TBLPARS         *tblpars;
                   1855: -
                   1856: - extern struct LOCVARS   *tblvars;
                   1857: - extern struct TBLPARS         *tablpars;
                   1858: -
                   1859: - extern int *reftasks, *processes, *basics;
                   1860: - extern int *globvars, *inits, *xob, *effnrstates;
                   1861: -
                   1862: - extern char qoverride;
                   1863: - extern int QMAX, msgbase, maxcol, assertbl, errortbl;
                   1864: -
                   1865: -#define tell(s)       fprintf(stderr, s)
                   1866: -
                   1867: -usage(str)
                   1868: -      char *str;
                   1869: -{     fprintf(stderr, "trace: %s\n", str);
                   1870: -      tell("usage: trace [-?] [N]\n");
                   1871: -      tell("\t-a show all prefixes leading into old states\n");
                   1872: -      tell("\t-b `blast mode' (quick, very partial search)\n");
                   1873: -      tell("\t-c  N  perform class N validation (N: 0..5) \n");
                   1874: -      tell("\t-f or -F alternative formats for printing queue histories\n");
                   1875: -      tell("\t-j stop at the first buffer lock found\n");
                   1876: -      tell("\t-k  N  restrict the state space cache to N thousand states\n");
                   1877: -      tell("\t-l show normal execution sequences and loops, but no prefixes\n");
                   1878: -      tell("\t-m  N  restrict search depth to N steps\n");
                   1879: -      tell("\t-n don't use timeout heuristics\n");
                   1880: -      tell("\t-q  N  set bound N on maximum queue size used\n");
                   1881: -      tell("\t-r  N  restrict the runtime to  N minutes\n");
                   1882: -      tell("\t-R  N  report on progress every N minutes\n");
                   1883: -      tell("\t-s show the transition tables (different if combined with `v')\n");
                   1884: -      tell("\t-v verbose - print execution times, etc.\n");
                   1885: -      tell("\t-x perform a scatter search\n");
                   1886: -      tell("\tno flag: try a sensible partial search\n");
                   1887: -      exit(1);
                   1888: -}
                   1889: -
                   1890: -/*
                   1891: - * calls on Emalloc and Realloc go straight to the library malloc
                   1892: - * it is used for data that may be realloced but is never released
                   1893: - * - Smalloc claims memory that is never realloced and never released
                   1894: - * - emalloc and efree handle memory that is never realloced but often released
                   1895: - * - talloc and tfree are direct calls on the tac-package (used via emalloc)
                   1896: - */
                   1897: -
                   1898: -char *
                   1899: -Stake(n)
                   1900: -{ char *try, *sbrk(), *Emalloc();
                   1901: -  extern int errno;
                   1902: -
                   1903: -      do {
                   1904: -              try = sbrk(n);
                   1905: -      } while ((int) try == -1 && errno == EINTR);
                   1906: -
                   1907: -      if ((int) try == -1)
                   1908: -              return Emalloc(n);      /* maybe some mem left here */
                   1909: -
                   1910: -      return try;
                   1911: -}
                   1912: -
                   1913: -#define CHUNK 4096
                   1914: -
                   1915: -char *have;
                   1916: -long left = 0;
                   1917: -
                   1918: -char *
                   1919: -Smalloc(n)
                   1920: -      unsigned n;
                   1921: -{ char *try;
                   1922: -
                   1923: -      if (n == 0)
                   1924: -              return (char *) NULL;
                   1925: -      if (left < n)
                   1926: -      {       unsigned grow = (n < CHUNK) ? CHUNK : n;
                   1927: -              have = Stake(grow);
                   1928: -              left = grow;
                   1929: -      }
                   1930: -      try = have;
                   1931: -      have += n;
                   1932: -      left -= n;
                   1933: -
                   1934: -      return try;
                   1935: -}
                   1936: -
                   1937: -char *
                   1938: -Emalloc(n)
                   1939: -      unsigned n;
                   1940: -{ char *try, *malloc();
                   1941: -
                   1942: -      if (n == 0)
                   1943: -              return (char *) NULL;
                   1944: -      if ((try = malloc(n)) == NULL)
                   1945: -              whoops("malloc fault");
                   1946: -
                   1947: -      return try;
                   1948: -}
                   1949: -
                   1950: -char *
                   1951: -Realloc(a, b)
                   1952: -      char *a; unsigned b;
                   1953: -{ char *try, *realloc();
                   1954: -
                   1955: -      if (b == 0)
                   1956: -              return (char *) NULL;
                   1957: -      if ((try = realloc(a, b)) == NULL)
                   1958: -              whoops("realloc returns 0");
                   1959: -
                   1960: -      return try;
                   1961: -}
                   1962: -
                   1963: -char *
                   1964: -emalloc(n)
                   1965: -      unsigned n;
                   1966: -{ char *try;
                   1967: -  char *talloc();
                   1968: -
                   1969: -      if (n == 0)
                   1970: -              return (char *) NULL;
                   1971: -      if ((try = talloc(n)) == NULL)
                   1972: -              whoops("talloc fault");
                   1973: -
                   1974: -      return try;
                   1975: -}
                   1976: -
                   1977: -efree(at)
                   1978: -      char *at;
                   1979: -{
                   1980: -      if (at) tfree(at);
                   1981: -}
                   1982: -
                   1983: -alloc1(x, y, z)
                   1984: -{ int n = x+y;
                   1985: -      tbl      = (struct TBL *)
                   1986: -              Smalloc(n * sizeof(struct TBL));
                   1987: -      tblpars  = (struct TBLPARS *)
                   1988: -              Smalloc(n * sizeof(struct TBLPARS));
                   1989: -      tblvars  = (struct LOCVARS *)
                   1990: -              Smalloc(n * sizeof(struct LOCVARS));
                   1991: -      reftasks = (int *)
                   1992: -              Smalloc(x * sizeof(int));
                   1993: -      processes = (int *)
                   1994: -              Smalloc(y * sizeof(int));
                   1995: -      lbt       = (struct LBT *)
                   1996: -              Smalloc(y * sizeof(struct LBT));
                   1997: -      procpars  = (struct VARPARS *)
                   1998: -              Smalloc(y * sizeof(struct VARPARS));
                   1999: -
                   2000: -      tablpars  = (struct TBLPARS *)
                   2001: -              Smalloc(y * sizeof(struct TBLPARS));
                   2002: -
                   2003: -      basics    = (int *)
                   2004: -              Smalloc(y * sizeof(int));
                   2005: -      procstack = (struct PROCSTACK **)
                   2006: -              Smalloc(y * sizeof(struct PROCSTACK *));
                   2007: -      mbox      = (struct MBOX *)
                   2008: -              Smalloc(z * sizeof(struct MBOX));
                   2009: -
                   2010: -      effnrstates = (int *)
                   2011: -              Smalloc(n * sizeof(int));
                   2012: -}
                   2013: -
                   2014: -alloc2(n, p, who)
                   2015: -{ char x;
                   2016: -
                   2017: -      x = (qoverride && p > QMAX)? QMAX : p;
                   2018: -
                   2019: -      if (x >= 256)
                   2020: -              whoops("illegal queue size");
                   2021: -      if (x >= 16)
                   2022: -              fprintf(stderr, "warning, very large qsize (%d), queue %d\n", x, n);
                   2023: -
                   2024: -      mbox[n].limit = x;
                   2025: -      mbox[n].owner = (who >= 0) ? who : 0;
                   2026: -}
                   2027: -
                   2028: -alloc3(n)
                   2029: -{     inits = (int *)
                   2030: -              Smalloc(n * sizeof(int));
                   2031: -}
                   2032: -
                   2033: -alloc4(n)
                   2034: -{     if (assertbl == NONE && errortbl == NONE)
                   2035: -              globvars = (int *)
                   2036: -                      Smalloc(n * sizeof(int));
                   2037: -      else
                   2038: -              globvars = (int *)
                   2039: -                      Emalloc(n * sizeof(int));
                   2040: -}
                   2041: -
                   2042: -alloc45(n)
                   2043: -{ register int i;
                   2044: -      fullname = (struct MNAME *)
                   2045: -              Smalloc(n * sizeof(struct MNAME));
                   2046: -      xob = (int *)
                   2047: -              Smalloc((n+msgbase) * sizeof(int));
                   2048: -      for (i = 0; i < n+msgbase; i++)
                   2049: -              xob[i] = -1;
                   2050: -}
                   2051: -
                   2052: -alloc5(n)
                   2053: -{ register int i, j, r, c;
                   2054: -
                   2055: -      r = tbl[n].nrrows;
                   2056: -      if ((c = tbl[n].nrcols) > maxcol)
                   2057: -              maxcol = c;
                   2058: -
                   2059: -      tbl[n].endrow  = (int *) Smalloc(r * sizeof(int));
                   2060: -      tbl[n].deadrow = (int *) Smalloc(r * sizeof(int));
                   2061: -      tbl[n].badrow  = (int *) Smalloc(r * sizeof(int));
                   2062: -      tbl[n].labrow  = (int *) Smalloc(r * sizeof(int));
                   2063: -      tbl[n].colmap  = (int *) Smalloc(c * sizeof(int));
                   2064: -      tbl[n].colorg  = (int *) Smalloc(c * sizeof(int));
                   2065: -      tbl[n].coltyp  = (int *) Smalloc(c * sizeof(int));
                   2066: -      tbl[n].ptr     = (struct IND **) Smalloc(r * sizeof(struct IND *));
                   2067: -      tbl[n].rowname = (char **) Smalloc(r * sizeof(char *));
                   2068: -
                   2069: -      for (i = 0; i < r; i++)
                   2070: -      {       tbl[n].ptr[i] = (struct IND *)
                   2071: -                      Smalloc(c * sizeof(struct IND));
                   2072: -              tbl[n].rowname[i] = (char *)
                   2073: -                      Smalloc(128 * sizeof(char));
                   2074: -
                   2075: -              for (j = 0; j < c; j++)
                   2076: -                      tbl[n].ptr[i][j].nrpils = 0;
                   2077: -              tbl[n].deadrow[i] = 1;
                   2078: -              tbl[n].endrow[i] = tbl[n].badrow[i] = 0;
                   2079: -              tbl[n].labrow[i] = 0;
                   2080: -      }
                   2081: -      tbl[n].labrow[0] = 1;   /* make sure initial state is always checked */
                   2082: -}
                   2083: -
                   2084: -alloc6(n, m, p, q)
                   2085: -{     tbl[n].ptr[m][p].one = (struct ELM *)
                   2086: -              Smalloc(q * sizeof(struct ELM));
                   2087: -}
                   2088: -
                   2089: -alloc8(pr, p, q)
                   2090: -{
                   2091: -      tablpars[pr].nrms = (short) p;                  /* available */
                   2092: -      tablpars[pr].nrvs = (short) q;
                   2093: -
                   2094: -      procpars[pr].ms = (short *)
                   2095: -              Emalloc(p * sizeof(short));
                   2096: -      procpars[pr].vs = (short *)
                   2097: -              Emalloc(q * sizeof(short));
                   2098: -
                   2099: -      procpars[pr].nrms = 0;                          /* actually used */
                   2100: -      procpars[pr].nrvs = 0;
                   2101: -}
                   2102: -
                   2103: -alloc9(in, p)
                   2104: -{
                   2105: -      tbl[in].calls = (struct CPARS *)
                   2106: -              Smalloc(p * sizeof(struct CPARS));
                   2107: -}
                   2108: -
                   2109: -alloc10(in, cn, p, q, r)
                   2110: -{
                   2111: -      tbl[in].calls[cn].callwhat = (short) p;
                   2112: -      tbl[in].calls[cn].nrms = (short) q;
                   2113: -      tbl[in].calls[cn].nrvs = (short) r;
                   2114: -
                   2115: -      tbl[in].calls[cn].ms = (short *)
                   2116: -                      Smalloc(q * sizeof (short));
                   2117: -
                   2118: -      tbl[in].calls[cn].vs = (short *)
                   2119: -                      Smalloc(r * sizeof (short));
                   2120: -}
                   2121: -
                   2122: -whoops(s)
                   2123: -      char *s;
                   2124: -{
                   2125: -      fprintf(stderr, "trace: %s\n", s);
                   2126: -      postlude();
                   2127: -      exit(1);
                   2128: -}
                   2129: -
                   2130: -badinput(s)
                   2131: -      char *s;
                   2132: -{     extern char fname[];
                   2133: -
                   2134: -      fflush(stdout);
                   2135: -      fprintf(stderr, "trace: read error `%s': %s\n", s, fname);
                   2136: -      exit(1);
                   2137: -}
                   2138: //GO.SYSIN DD trace2.c
                   2139: echo trace3.c 1>&2
                   2140: sed 's/.//' >trace3.c <<'//GO.SYSIN DD trace3.c'
                   2141: -#include <stdio.h>
                   2142: -#include "trace.h"
                   2143: -#include "trace.d"
                   2144: -
                   2145: -#define DEBUG 0
                   2146: -
                   2147: -#define BS(n) ((n) & ~(PASSED))
                   2148: -
                   2149: - extern struct TBL       *tbl;
                   2150: - extern struct LBT     *lbt;
                   2151: - extern struct MBOX      *mbox;
                   2152: - extern struct MNAME     *fullname;
                   2153: - extern struct PROCSTACK **procstack;
                   2154: -
                   2155: - extern struct VARPARS         *procpars;
                   2156: - extern struct TBLPARS         *tblpars;
                   2157: -
                   2158: - extern struct LOCVARS   *tblvars;
                   2159: - extern struct TBLPARS   *tablpars;
                   2160: -
                   2161: - extern struct QUEUE **starter, **head, **tail;
                   2162: - extern struct QUEUE *s_first, *s_last;
                   2163: - extern struct VISIT *lastvisit;
                   2164: -
                   2165: - extern int *reftasks, *processes, *basics;
                   2166: - extern int *globvars, *inits, *state, *qsize;
                   2167: -
                   2168: - extern int nrtbl, nrqs, nrrefs, nrprocs, nrinit;
                   2169: - extern int nrvars, nrmesgs, msgbase;
                   2170: - extern int maxlevel, maxreached;
                   2171: -
                   2172: - extern char noshortcut, prbyq, timedd, blast, qandirty, muststore;
                   2173: - extern char maxxed, completed, lockplus, firstlock;
                   2174: -
                   2175: - extern long locksf, normf, loopsf;
                   2176: - extern double zapper;
                   2177: -
                   2178: - short lastqueue;             /* the last queue addressed */
                   2179: - int level = 0;
                   2180: - double COUNT = 0;
                   2181: -
                   2182: - char *emalloc(), *Realloc(), *Emalloc();
                   2183: -
                   2184: -determine(m)
                   2185: -{
                   2186: -      if (m >= 3*MANY)        return 0;       /* constant  */
                   2187: -      else if (m >= 2*MANY)   return 1;       /* parameter */
                   2188: -      else if (m >= MANY)     return 2;       /* local     */
                   2189: -      else if (m >= 0)        return 3;       /* global    */
                   2190: -      else if (m < -3*MANY)   return 5;       /* negative number */
                   2191: -      else if (m <= -2)       return 4;       /* expression */
                   2192: -      else
                   2193: -              whoops("cannot happen - determine");
                   2194: -}
                   2195: -
                   2196: -convert(m, pr)
                   2197: -{ int res, n = m;
                   2198: -
                   2199: -      /* convert a pvar: global, local, parameter, or a constant */
                   2200: -
                   2201: -      switch (determine(n)) {
                   2202: -      case 5: res = n + 3*MANY; break;
                   2203: -      case 4: res = evalcond(-(m+2), pr); break;
                   2204: -      case 0: res = n - 3*MANY; break;
                   2205: -      case 1: res = wapper(m, pr); break;
                   2206: -      case 2: n -= MANY;
                   2207: -              if (n >= 0 && n < (int) procpars[pr].nrlvars)
                   2208: -                      res = (int) procpars[pr].lvarvals[n];
                   2209: -              else
                   2210: -                      whoops("reference to non-existing local var");
                   2211: -              break;
                   2212: -      case 3: if (n >= 0 && n < nrvars)
                   2213: -                      res = globvars[n];
                   2214: -              else
                   2215: -                      whoops("reference to non-existing global var");
                   2216: -              break;
                   2217: -      default:
                   2218: -              whoops("cannot happen - convert");      /* got a parameter */
                   2219: -              break;
                   2220: -      }
                   2221: -      return res;
                   2222: -}
                   2223: -
                   2224: -wapper(n, pr)
                   2225: -{ int x = n - 2*MANY;
                   2226: -  int y;
                   2227: -      if (x < 0 || x >= MANY)
                   2228: -              return n;       /* not a parameter */
                   2229: -      else
                   2230: -      {       if (x >= procpars[pr].nrvs)
                   2231: -                      whoops("unknown parameter of type pvar");
                   2232: -              y = (int) procpars[pr].vs[x];
                   2233: -              if (y >= 2*MANY && y < 3*MANY)
                   2234: -                      whoops("unresolved parameter reference");
                   2235: -              return y;
                   2236: -      }
                   2237: -}
                   2238: -
                   2239: -mapper(n, pr)                 /* convert a message parameter */
                   2240: -{ register int x = n - MANY;
                   2241: -
                   2242: -      if (x < 0 || x >= MANY)
                   2243: -              return n;       /* not a parameter */
                   2244: -      else
                   2245: -      {       if (x >= procpars[pr].nrms)
                   2246: -                      whoops("bad news: illegal message parameter");
                   2247: -              return ((int)procpars[pr].ms[x]);
                   2248: -      }
                   2249: -}
                   2250: -
                   2251: -matchon(n, m, t, trial, TT, pr)
                   2252: -{
                   2253: -#if DEBUG
                   2254: -      printf("trial %d, pr %d; ", trial, pr);
                   2255: -      if (TT == INP || TT == OUTP)
                   2256: -              printf("msg %s, ", fullname[n-msgbase].mname);
                   2257: -      else
                   2258: -              printf("code %d, ", n);
                   2259: -      printf("q %d, tbl %d, type %d\n", m, t, TT);
                   2260: -#endif
                   2261: -
                   2262: -      if (trial == 2)
                   2263: -              return (TT == TMO && qsize[m] == 0);
                   2264: -      else
                   2265: -      {
                   2266: -              switch (TT) {
                   2267: -              case FCT :
                   2268: -              case SPN : return 1;
                   2269: -              case CND : return (evalcond(n, pr));
                   2270: -              case DFL : return (qsize[m] > 0 && no_other(t,head[m]->mesg,pr));
                   2271: -              case INP : return (qsize[m] > 0 && BS(head[m]->mesg) == n);
                   2272: -              case TMO : return (noshortcut && qsize[m] == 0);
                   2273: -              case OUTP: return (qsize[m] < mbox[m].limit);
                   2274: -              default  : whoops("unknown type in column head");
                   2275: -              }
                   2276: -      }
                   2277: -}
                   2278: -
                   2279: -no_other(x, yy, pr)
                   2280: -{ struct TBL *tmp = &(tbl[x]);
                   2281: -  int y = BS(yy);
                   2282: -  int j = tmp->nrcols;
                   2283: -  int h = state[pr];
                   2284: -  int i;
                   2285: -
                   2286: -      for (i = 0; i < j; i++)
                   2287: -      {       if (tmp->coltyp[i] == INP
                   2288: -              &&  tmp->ptr[h][i].nrpils > 0
                   2289: -              &&  y == lbt[pr].mapcol[i])
                   2290: -                      return 0;
                   2291: -      }
                   2292: -      return 1;
                   2293: -}
                   2294: -
                   2295: -send(m, to, with, pr, nst)
                   2296: -{ struct QUEUE *tmp;
                   2297: -  register struct QUEUE *hook = tail[to];
                   2298: -  int what = NONE;
                   2299: -
                   2300: -      if (with != NONE)
                   2301: -      {       if ((what = convert(with, pr)) >= USED - 1 || what < 0)
                   2302: -              {       output("aborted: ", 0);
                   2303: -                      whoops("cargo too large or negative");
                   2304: -              }
                   2305: -              hook->cargo = (unsigned short) ( what | USED );
                   2306: -      } else
                   2307: -              hook->cargo = (unsigned short) 0;
                   2308: -
                   2309: -      if (qsize[to] >= mbox[to].limit)
                   2310: -              whoops("cannot happen - send");
                   2311: -
                   2312: -      tmp = (struct QUEUE *) emalloc(sizeof(struct QUEUE));
                   2313: -      tmp->last  = hook;
                   2314: -#if TRAIL
                   2315: -      hook->tstate[0] = (short) processes[pr];
                   2316: -      hook->tstate[1] = (short) nst;
                   2317: -#endif TRAIL
                   2318: -
                   2319: -      hook->mesg = (short) m;
                   2320: -      hook->next = tmp;
                   2321: -      hook->s_back = s_last;
                   2322: -      hook->s_forw = NULL;
                   2323: -      if (s_last == NULL)
                   2324: -              s_first = hook;
                   2325: -      else
                   2326: -              s_last->s_forw = hook;
                   2327: -
                   2328: -      s_last = hook;
                   2329: -      tail[to] = tmp;
                   2330: -      qsize[to]++;
                   2331: -#if DEBUG
                   2332: -      printf("\tsent %d to %d, size %d, ", m, to, qsize[to]);
                   2333: -      printf("cargo %d [%d]\n", what, hook->cargo);
                   2334: -#endif
                   2335: -      require(OUTP, m, to);
                   2336: -
                   2337: -      return 1;
                   2338: -}
                   2339: -
                   2340: -receive(from, with, pr, ice)
                   2341: -      struct FREEZE *ice;
                   2342: -{ struct QUEUE *hook;
                   2343: -  int what=NONE, wither;
                   2344: -
                   2345: -      if (qsize[from] <= 0)
                   2346: -              whoops("trying to receive from empty queue");
                   2347: -
                   2348: -      hook = head[from];
                   2349: -      if (hook->cargo & USED)
                   2350: -      {       what = (int) ((hook->cargo) & (~USED));
                   2351: -              if (with == NONE)
                   2352: -              {       fprintf(stderr, "value %d sent (msg: ", what);
                   2353: -                      putname(hook, 1);
                   2354: -                      fprintf(stderr, ") but not expected\n");
                   2355: -              }
                   2356: -              else
                   2357: -              {       ice->whichvar = wither = wapper(with, pr);
                   2358: -                      if (wither >= 3*MANY || wither <= -3*MANY)
                   2359: -                              whoops("receiving into a constant...");
                   2360: -                      if (wither < MANY)
                   2361: -                      {       ice->oldvalue = globvars[wither];
                   2362: -                              globvars[wither] = what;
                   2363: -                      } else
                   2364: -                      { int n = wither - MANY;        
                   2365: -                              if (n >= 0 && n < (int) procpars[pr].nrlvars)
                   2366: -                              {       ice->oldvalue = procpars[pr].lvarvals[n];
                   2367: -                                      procpars[pr].lvarvals[n] = (short) what;
                   2368: -                              } else
                   2369: -                                      whoops("unknown local var");
                   2370: -                      }
                   2371: -              }
                   2372: -      } else
                   2373: -      {       if (with != NONE)
                   2374: -              {       fprintf(stderr, "value %d expected (msg: ", with);
                   2375: -                      putname(hook, 1);
                   2376: -                      fprintf(stderr, ") but not sent\n");
                   2377: -              }
                   2378: -      }
                   2379: -
                   2380: -      hook->mesg |= PASSED;
                   2381: -#if DEBUG
                   2382: -      printf("\trecv %d from queue %d, ", head[from]->mesg & (~PASSED), from);
                   2383: -      printf("cargo %d [%d], into var %d\n", what, hook->cargo, with);
                   2384: -#endif
                   2385: -
                   2386: -      head[from] = hook->next;
                   2387: -      qsize[from]--;
                   2388: -
                   2389: -      require(INP, (hook->mesg & (~PASSED)), from);
                   2390: -
                   2391: -      return 1;
                   2392: -}
                   2393: -
                   2394: -unrecv(from)
                   2395: -{
                   2396: -      if (head[from] == starter[from])
                   2397: -              whoops("unreceiving beyond initial state");
                   2398: -
                   2399: -      head[from] = head[from]->last;
                   2400: -      head[from]->mesg &= (~PASSED);
                   2401: -
                   2402: -      qsize[from]++;
                   2403: -}
                   2404: -
                   2405: -unsend()
                   2406: -{ short i = lastqueue;
                   2407: -
                   2408: -      if (tail[i] == starter[i])
                   2409: -              whoops("unsending beyond initial state");
                   2410: -      if ((tail[i] = tail[i]->last) != s_last)
                   2411: -              whoops("unsend: tail not last sent message");
                   2412: -
                   2413: -      if ((s_last = s_last->s_back) != NULL)
                   2414: -              s_last->s_forw = NULL;
                   2415: -      else
                   2416: -              s_first = NULL;
                   2417: -      efree(tail[i]->next);
                   2418: -
                   2419: -      qsize[i]--;
                   2420: -}
                   2421: -
                   2422: -output(tag, willabort)
                   2423: -      char *tag;
                   2424: -{ struct QUEUE *tmp;
                   2425: -
                   2426: -      printf("%s", tag);
                   2427: -
                   2428: -      if ((tmp = s_first) != NULL)
                   2429: -      {       formatted((struct QUEUE *) 0);
                   2430: -              if (prbyq != 2)
                   2431: -              do putname(tmp, 0); while ((tmp = tmp->s_forw) != NULL);
                   2432: -              putchar('\n');
                   2433: -      } else
                   2434: -              printf("null output\n");
                   2435: -
                   2436: -      if (willabort == 2 || (firstlock && willabort == 1))
                   2437: -      {       completed = 1;
                   2438: -              postlude();
                   2439: -      }
                   2440: -}
                   2441: -
                   2442: -putname(tmp, how)
                   2443: -      struct QUEUE *tmp;
                   2444: -{ int i, k = (int) (BS(tmp->mesg)) - msgbase;
                   2445: -  char nnn[128];
                   2446: -
                   2447: -      i = strlen(fullname[k].mname);
                   2448: -      if (tmp->mesg & PASSED)
                   2449: -              sprintf(nnn, "%s", fullname[k].mname);
                   2450: -      else
                   2451: -      {       sprintf(nnn, "[%s]", fullname[k].mname);
                   2452: -              i += 2;
                   2453: -      }
                   2454: -
                   2455: -      if (tmp->cargo & USED)
                   2456: -              sprintf(&nnn[i], "(%d),", (tmp->cargo & (~USED)));
                   2457: -      else
                   2458: -              sprintf(&nnn[i], ",");
                   2459: -
                   2460: -      if (how)
                   2461: -              fprintf(stderr, "%s", nnn);
                   2462: -      else
                   2463: -              printf("%s", nnn);
                   2464: -
                   2465: -      return strlen(nnn);
                   2466: -}
                   2467: -
                   2468: -inendstate()
                   2469: -{ int i, j, k;
                   2470: -
                   2471: -      for (i = 0, k = nrprocs; i < nrprocs; i++)
                   2472: -      {       j = processes[i];
                   2473: -              if (j != basics[i] || tbl[j].endrow[state[i]] != 1)
                   2474: -                      k--;
                   2475: -      }
                   2476: -      return k;
                   2477: -}
                   2478: -
                   2479: -formatted(at)
                   2480: -      struct QUEUE *at;
                   2481: -{ struct QUEUE *tmp = s_first;
                   2482: -  int i, j; extern int linecode;
                   2483: -
                   2484: -      if (tmp == NULL)
                   2485: -              return;
                   2486: -
                   2487: -      switch((int) prbyq) {
                   2488: -      case 0: break;
                   2489: -      case 1:
                   2490: -              for (i = 0; i < nrqs; i++)
                   2491: -              {       printf("\n\t%s = {", mbox[i].qname);
                   2492: -                      for (tmp = starter[i]; tmp != tail[i]; tmp = tmp->next)
                   2493: -                              putname(tmp, 0);
                   2494: -                      printf("}");
                   2495: -              }
                   2496: -              printf("\nexecution sequence:\n\t");
                   2497: -              break;
                   2498: -      case 2: putchar('\n');
                   2499: -              for (i = 0; i < nrqs; i++)
                   2500: -                      printf("%2d = %s\n", i, mbox[i].qname);
                   2501: -              for (i = 0; i < nrqs; i++)
                   2502: -                      printf("\t%2d", i);
                   2503: -#if TRAIL
                   2504: -              if (linecode)
                   2505: -                      printf("               \tsource");
                   2506: -#endif TRAIL
                   2507: -              putchar('\n');
                   2508: -              do
                   2509: -              {       if (tmp == at)
                   2510: -                              printf(" >>");
                   2511: -                      for (i = j = whichq(BS(tmp->mesg)); i >= 0; i--)
                   2512: -                              putchar('\t');
                   2513: -                      i = putname(tmp, 0);
                   2514: -#if TRAIL
                   2515: -                      if (linecode)
                   2516: -                      { for (i = 16-i;   i > 0; i--) putchar(' ');
                   2517: -                        for (j = nrqs-j; j > 0; j--) putchar('\t');
                   2518: -                        printf("%s", tbl[tmp->tstate[0]].rowname[tmp->tstate[1]]);
                   2519: -                      }
                   2520: -#endif TRAIL
                   2521: -                      putchar('\n');
                   2522: -              } while ((tmp = tmp->s_forw) != NULL);
                   2523: -              if (at != NULL)
                   2524: -                      printf(" >>\n");
                   2525: -              break;
                   2526: -      }
                   2527: -}
                   2528: -
                   2529: -putloop(at, aa)
                   2530: -      struct QUEUE *at;
                   2531: -      char aa;
                   2532: -{ register struct QUEUE *tmp = s_first;
                   2533: -
                   2534: -      if (aa)
                   2535: -              printf("loop:\t");
                   2536: -      else
                   2537: -              printf("assertion violated: ");
                   2538: -
                   2539: -      if (s_first != NULL)
                   2540: -      {       formatted(at);
                   2541: -              if (prbyq != 2)
                   2542: -              {       do
                   2543: -                      {       putname(tmp, 0);
                   2544: -                              if (tmp == at)
                   2545: -                                      printf("//");
                   2546: -                      } while ((tmp = tmp->s_forw) != NULL);
                   2547: -                      printf("//\n");
                   2548: -              }
                   2549: -      } else
                   2550: -              printf("null output\n");
                   2551: -}
                   2552: -
                   2553: -ppop(pr)
                   2554: -{ struct PROCSTACK *tmp = procstack[pr];
                   2555: -  int i = (int) procstack[pr]->uptable;
                   2556: -
                   2557: -      if (procstack[pr] == NULL)
                   2558: -              whoops("null stack");
                   2559: -
                   2560: -      restorvarpars(tmp->varparsaved,  pr);
                   2561: -      procstack[pr] = procstack[pr]->follow;
                   2562: -
                   2563: -      efree(tmp->varparsaved);
                   2564: -      efree(tmp);
                   2565: -
                   2566: -      return i;       /* we're returing to this table */
                   2567: -}
                   2568: -
                   2569: -ppush(pr, what, tr)
                   2570: -{ struct PROCSTACK *tmp;
                   2571: -
                   2572: -      tmp = (struct PROCSTACK *)
                   2573: -              emalloc(sizeof(struct PROCSTACK));
                   2574: -
                   2575: -      tmp->varparsaved  = (struct VARPARS *)
                   2576: -                      emalloc(sizeof(struct VARPARS));
                   2577: -
                   2578: -      savevarpars (tmp->varparsaved,  pr);
                   2579: -
                   2580: -      tmp->uptable = (short) what;
                   2581: -      tmp->uptransf = (short) tr;
                   2582: -      tmp->follow = procstack[pr];
                   2583: -      procstack[pr] = tmp;
                   2584: -}
                   2585: -
                   2586: -setlvars(to, pr)
                   2587: -{ register int i;
                   2588: -  short z = tblvars[to].nrlvars;
                   2589: -
                   2590: -      if (z > tablpars[pr].nrlvars)
                   2591: -      {       if (tablpars[pr].nrlvars > 0)
                   2592: -                      procpars[pr].lvarvals = (short *)
                   2593: -                              Realloc(procpars[pr].lvarvals, z * sizeof(short));
                   2594: -              else
                   2595: -                      procpars[pr].lvarvals = (short *)
                   2596: -                              Emalloc(z * sizeof(short));
                   2597: -
                   2598: -              tablpars[pr].nrlvars = z;
                   2599: -      }
                   2600: -
                   2601: -      procpars[pr].nrlvars = z;
                   2602: -
                   2603: -      for (i = 0; i < z; i++)
                   2604: -              procpars[pr].lvarvals[i] = convert(tblvars[to].lvarvals[i], pr);
                   2605: -}
                   2606: -
                   2607: -setpars(from, to, pr)
                   2608: -      struct CPARS *from;
                   2609: -{ struct VARPARS tbuff;
                   2610: -  register int i;
                   2611: -  short x = tblpars[to].nrms;
                   2612: -  short y = tblpars[to].nrvs;
                   2613: -
                   2614: -      savemapped(&tbuff, from, pr);   /* mapper() needs old nrms & nrvs */
                   2615: -
                   2616: -      if (x > tablpars[pr].nrms)
                   2617: -      {       if (tablpars[pr].nrms > 0)
                   2618: -                      procpars[pr].ms = (short *)
                   2619: -                              Realloc(procpars[pr].ms, x * sizeof(short));
                   2620: -              else
                   2621: -                      procpars[pr].ms = (short *)
                   2622: -                              Emalloc(x * sizeof(short));
                   2623: -
                   2624: -              tablpars[pr].nrms = x;
                   2625: -      }
                   2626: -      if (y > tablpars[pr].nrvs)
                   2627: -      {       if (tablpars[pr].nrvs > 0)
                   2628: -                      procpars[pr].vs = (short *)
                   2629: -                              Realloc(procpars[pr].vs, y * sizeof(short));
                   2630: -              else
                   2631: -                      procpars[pr].vs = (short *)
                   2632: -                              Emalloc(y * sizeof(short));
                   2633: -
                   2634: -              tablpars[pr].nrvs = y;
                   2635: -      }
                   2636: -
                   2637: -      procpars[pr].nrms = tbuff.nrms;
                   2638: -      procpars[pr].nrvs = tbuff.nrvs;
                   2639: -
                   2640: -      for (i = 0; i < procpars[pr].nrms; i++)
                   2641: -              procpars[pr].ms[i] = tbuff.ms[i];
                   2642: -
                   2643: -      for (i = 0; i < procpars[pr].nrvs; i++)
                   2644: -              procpars[pr].vs[i] = tbuff.vs[i];
                   2645: -
                   2646: -      efree(tbuff.ms); efree(tbuff.vs);
                   2647: -}
                   2648: -
                   2649: -#if DEBUG
                   2650: -showstate()
                   2651: -{ int i, j;
                   2652: -      printf("%2d: S:", level);
                   2653: -      for (i = 0; i < nrprocs; i++)
                   2654: -              printf("%d,", state[i]);
                   2655: -      printf("M:");
                   2656: -      for (i = 0; i < nrprocs; i++)
                   2657: -              printf("%d,", processes[i]);
                   2658: -      printf("Q:");
                   2659: -      for (i = 0; i < nrqs; i++)
                   2660: -              printf("%d,", qsize[i]);
                   2661: -      printf("H:");
                   2662: -      for (i = 0; i < nrqs; i++)
                   2663: -              if (qsize[i] == 0)
                   2664: -                      printf("-,");
                   2665: -              else
                   2666: -              {       j = (int) BS(head[i]->mesg);
                   2667: -                      printf("%s,", fullname[j-msgbase].mname);
                   2668: -              }
                   2669: -      printf("\tV:");
                   2670: -      for (i = 0; i < nrprocs; i++)
                   2671: -      {       for (j = 0; j < procpars[i].nrlvars; j++)
                   2672: -                      printf("%d ", procpars[i].lvarvals[j]);
                   2673: -              putchar(';');
                   2674: -      }
                   2675: -      putchar('\n');
                   2676: -}
                   2677: -#endif
                   2678: -
                   2679: -retable(prc, ice)
                   2680: -      struct FREEZE *ice;
                   2681: -{ struct CUBE *it, *here;
                   2682: -  int t = processes[prc];
                   2683: -
                   2684: -      if (ice->cube == NULL)
                   2685: -      {       here = ice->cube = (struct CUBE *)
                   2686: -                      emalloc(sizeof(struct CUBE));
                   2687: -              here->pntr = here->rtnp = NULL;
                   2688: -      } else
                   2689: -      {       for (it = ice->cube; it->pntr != NULL; it = it->pntr)
                   2690: -                      ;
                   2691: -              it->pntr = (struct CUBE *)
                   2692: -                      emalloc(sizeof(struct CUBE));
                   2693: -              it->pntr->rtnp = it;
                   2694: -              here = it->pntr;
                   2695: -              here->pntr = NULL;
                   2696: -      }
                   2697: -      here->poporpush = POP;
                   2698: -      here->which = (short) prc;
                   2699: -      here->procsaved = (short) t;
                   2700: -      here->transfsaved = procstack[prc]->uptransf;
                   2701: -      here->varparsaved  = (struct VARPARS *)
                   2702: -                      emalloc(sizeof(struct VARPARS));
                   2703: -
                   2704: -      savevarpars(here->varparsaved, prc);
                   2705: -      processes[prc] = ppop(prc);
                   2706: -      fiddler(prc);
                   2707: -      state[prc] = (int) here->transfsaved;
                   2708: -      muststore = tbl[processes[prc]].labrow[state[prc]];
                   2709: -}
                   2710: -
                   2711: -savevarpars(at, j)
                   2712: -      struct VARPARS *at;
                   2713: -{ register int i;
                   2714: -  struct VARPARS *it;
                   2715: -
                   2716: -      it = &(procpars[j]);
                   2717: -      at->nrms    = it->nrms;
                   2718: -      at->nrvs    = it->nrvs;
                   2719: -      at->nrlvars = it->nrlvars;
                   2720: -
                   2721: -      at->ms = (short *) emalloc(it->nrms * sizeof(short));
                   2722: -      at->vs = (short *) emalloc(it->nrvs * sizeof(short));
                   2723: -      at->lvarvals = (short *) emalloc(it->nrlvars * sizeof(short));
                   2724: -
                   2725: -      for (i = 0; i < at->nrms; i++)
                   2726: -              at->ms[i] = it->ms[i];
                   2727: -      for (i = 0; i < at->nrvs; i++)
                   2728: -              at->vs[i] = it->vs[i];
                   2729: -      for (i = 0; i < it->nrlvars; i++)
                   2730: -              at->lvarvals[i] = it->lvarvals[i];
                   2731: -}
                   2732: -
                   2733: -savemapped(at, it, j)
                   2734: -      struct VARPARS *at;
                   2735: -      struct CPARS  *it;
                   2736: -{ register int i;
                   2737: -
                   2738: -      at->nrms = it->nrms;
                   2739: -      at->nrvs = it->nrvs;
                   2740: -
                   2741: -      at->ms = (short *)
                   2742: -              emalloc(it->nrms * sizeof(short));
                   2743: -      at->vs = (short *)
                   2744: -              emalloc(it->nrvs * sizeof(short));
                   2745: -
                   2746: -      for (i = 0; i < at->nrms; i++)
                   2747: -              at->ms[i] = (short) mapper(it->ms[i], j);
                   2748: -
                   2749: -      for (i = 0; i < at->nrvs; i++)
                   2750: -              at->vs[i] = (short) convert(it->vs[i], j);
                   2751: -}
                   2752: -
                   2753: -restorvarpars(at, pr)
                   2754: -      struct VARPARS *at;
                   2755: -{ register int i;
                   2756: -
                   2757: -      procpars[pr].nrms     = at->nrms;
                   2758: -      procpars[pr].nrvs     = at->nrvs;
                   2759: -      procpars[pr].nrlvars = at->nrlvars;
                   2760: -
                   2761: -      for (i = 0; i < at->nrms; i++)
                   2762: -              procpars[pr].ms[i] = at->ms[i];
                   2763: -
                   2764: -      for (i = 0; i < at->nrvs; i++)
                   2765: -              procpars[pr].vs[i] = at->vs[i];
                   2766: -
                   2767: -      for (i = 0; i < at->nrlvars; i++)
                   2768: -              procpars[pr].lvarvals[i] = at->lvarvals[i];
                   2769: -
                   2770: -      efree(at->ms);
                   2771: -      efree(at->vs);
                   2772: -      efree(at->lvarvals);
                   2773: -}
                   2774: -
                   2775: -freeze(icy)
                   2776: -      struct FREEZE *icy;
                   2777: -{ register int i;
                   2778: -  struct FREEZE *ice = icy;
                   2779: -
                   2780: -  ice->statsaved = (short *) emalloc(nrprocs * sizeof(short));
                   2781: -  ice->varsaved  = (short *) emalloc(nrvars  * sizeof(short));
                   2782: -
                   2783: -  ice->lastsav = lastqueue;
                   2784: -  ice->cube = NULL;
                   2785: -
                   2786: -  for (i = 0; i < nrvars; i++)
                   2787: -      ice->varsaved[i] = (short) globvars[i];
                   2788: -
                   2789: -  for (i = 0; i < nrprocs; i++)
                   2790: -  {
                   2791: -      ice->statsaved[i] = (short) state[i];
                   2792: -
                   2793: -      while (tbl[processes[i]].deadrow[state[i]] && procstack[i] != NULL)
                   2794: -              retable(i, ice);
                   2795: - }
                   2796: -}
                   2797: -
                   2798: -unfreeze(ice)
                   2799: -      struct FREEZE *ice;
                   2800: -{ struct CUBE *here;
                   2801: -  register int i;
                   2802: -
                   2803: -  lastqueue = ice->lastsav;
                   2804: -
                   2805: -  for (i = 0; i < nrprocs; i++)
                   2806: -      state[i] = (int) ice->statsaved[i];
                   2807: -  for (i = 0; i < nrvars; i++)
                   2808: -      globvars[i] = (int) ice->varsaved[i];
                   2809: -
                   2810: -  if ((here = ice->cube) != NULL)
                   2811: -      while (here->pntr != NULL)
                   2812: -              here = here->pntr;
                   2813: -
                   2814: -  for (; here != NULL;)
                   2815: -  {   i = (int) here->which;
                   2816: -      if (here->poporpush == PUSH)
                   2817: -      {       processes[i] = ppop(i);
                   2818: -      } else
                   2819: -      {       /* use cube to restore the values from before the ppop */
                   2820: -              ppush(i, processes[i], (int) here->transfsaved);
                   2821: -              restorvarpars (here->varparsaved,  i);
                   2822: -              processes[i] = (int) here->procsaved;
                   2823: -              efree(here->varparsaved);
                   2824: -      }
                   2825: -      efree(here);
                   2826: -      fiddler(i);
                   2827: -
                   2828: -      if (here == ice->cube)
                   2829: -              break;
                   2830: -      else
                   2831: -              here = here->rtnp;
                   2832: -  }
                   2833: -  efree(ice->statsaved);
                   2834: -  efree(ice->varsaved);
                   2835: -}
                   2836: -
                   2837: -FSE(I)
                   2838: -{ short g, h, i, j, k, t, x, y, z, X, Y, how;
                   2839: -  char progress = 0, internal;
                   2840: -  struct FREEZE *delta = (struct FREEZE *) emalloc(sizeof(struct FREEZE));
                   2841: -  struct STATE *iam = NULL, *inloop();
                   2842: -  struct VISIT *ticket;
                   2843: -
                   2844: -  if (level >= maxreached)
                   2845: -  {   if (maxxed && level >= maxlevel)
                   2846: -      {       efree(delta);
                   2847: -              return;
                   2848: -      }
                   2849: -      if (level > maxreached)
                   2850: -              maxreached = level;
                   2851: -  }
                   2852: -  freeze(delta);
                   2853: -
                   2854: -  if (muststore && (iam = inloop()) == NULL)
                   2855: -  {   unfreeze(delta);
                   2856: -      efree(delta);
                   2857: -      return;
                   2858: -  }
                   2859: -
                   2860: -/*
                   2861: - *    this state has not been seen before; the state
                   2862: - *    information has been saved in the structure
                   2863: - *    `STATE'; queue information has been saved in the
                   2864: - *    last `VISIT' template of this state;
                   2865: - *    we save a pointer to this template in a local variable:
                   2866: - *    to be able to mark the state `analyzed' when we return
                   2867: - *    for efficiency a pointer to the last visit is kept in a global `lastvisit'
                   2868: - */
                   2869: -  ticket = lastvisit;
                   2870: -  level++;
                   2871: -  COUNT += (double) 1;
                   2872: -
                   2873: -/* three tries:
                   2874: - *    1st try accepts internal moves (no timeouts, no outputs),
                   2875: - *    2nd try accepts any moves except timeouts,
                   2876: - *    3rd try accepts only timeouts.
                   2877: - */
                   2878: -
                   2879: -  for (X = 0; X <= 2; X++)
                   2880: -  {   internal = 0;
                   2881: -      for (g = 0, i = I; g < nrprocs; g++, i = (i+1)%nrprocs)
                   2882: -      {       t = processes[i];
                   2883: -              k = state[i];
                   2884: -
                   2885: -              if (X == 0 && tbl[t].badrow[k])
                   2886: -                      continue;       /* first try: skip fsm without receives */
                   2887: -
                   2888: -      for (j = 0; j < tbl[t].nrcols; j++)
                   2889: -      {       if ((z = tbl[t].ptr[k][j].nrpils) == 0)
                   2890: -                      continue;
                   2891: -
                   2892: -              x = lbt[i].mapcol[j];
                   2893: -              y = lbt[i].orgcol[j];
                   2894: -              Y = tbl[t].coltyp[j];
                   2895: -
                   2896: -              if (matchon(x, y, t, X, Y, i))
                   2897: -              {       for (h = 0; h < z; h++)
                   2898: -                      {       how = forward(t, k, j, h, x, y, i, Y, delta);
                   2899: -
                   2900: -                              if (qandirty || how == 0 || how >= LV || how == TC)
                   2901: -                                      internal = 1;
                   2902: -
                   2903: -                              progress++;
                   2904: -#if DEBUG
                   2905: -                              printf("\tdown   - %d/%d/%d\n", t, j, h);
                   2906: -                              showstate();
                   2907: -#endif
                   2908: -                      /*      FSE(mbox[lastqueue].owner); */
                   2909: -                              FSE(0);
                   2910: -
                   2911: -                              backup(k, how, y, i, delta);
                   2912: -#if DEBUG
                   2913: -                              printf("\tup   - %d/%d/%d\n", t, j, h);
                   2914: -                              showstate();
                   2915: -#endif
                   2916: -              }       }               /* innermost loop: non-determinism */
                   2917: -              if (blast && progress > 0)
                   2918: -                      break;
                   2919: -      }                               /* inner loop: options per process */
                   2920: -      if (internal)
                   2921: -              break;
                   2922: -      }                               /* outer loop: parallelism         */
                   2923: -      if (progress)
                   2924: -              break;                  /* normal exit */
                   2925: -  }                                   /* outermost loop: 2 trials */
                   2926: -  if (progress == 0)
                   2927: -  {
                   2928: -      if ((k = inendstate()) == nrprocs)
                   2929: -      {       normf++;
                   2930: -              if (assertholds())
                   2931: -              {       if (lockplus) output("endstate: ", 0);
                   2932: -              } else
                   2933: -                      output("assertion violated: ", 0);
                   2934: -      }
                   2935: -      else
                   2936: -      {       locksf++;
                   2937: -              if (k == 0)
                   2938: -                      output("deadlock: ", 1);
                   2939: -              else
                   2940: -                      output("partial lock: ", 1);
                   2941: -              if (linecode)
                   2942: -              {       printf("State at time of lock:\n");
                   2943: -                      for (i = 0; i < nrprocs; i++)
                   2944: -                              printf("\tprocess %3d: state %s\n", i,
                   2945: -                      tbl[processes[i]].rowname[state[i]]);
                   2946: -                      putchar('\n');
                   2947: -  }   }       }
                   2948: -
                   2949: -  level--;
                   2950: -
                   2951: -  unfreeze(delta); efree(delta);
                   2952: -  if (iam != NULL)
                   2953: -  {   mark(iam, ticket);
                   2954: -      if (zapper > 0 && (progress == 0 || level >= maxlevel-3))
                   2955: -              swiffle(iam, ticket);
                   2956: -  }
                   2957: -}
                   2958: -
                   2959: -forward(tb, k, j, h, m, from, pr, TT, ice)
                   2960: -      struct FREEZE *ice;
                   2961: -{ int how=0, n=m;
                   2962: -  struct ELM *at;
                   2963: -
                   2964: -      ice->whichvar = NONE;
                   2965: -
                   2966: -      at = &(tbl[tb].ptr[k][j].one[h]);
                   2967: -
                   2968: -      switch (TT) {
                   2969: -              case SPN: how = evalexpr(at->valtrans, pr, ice);
                   2970: -                        break;
                   2971: -              case CND: break;        /* `matchon()' already checked it */
                   2972: -              case FCT: m = (int) tbl[tb].calls[n].callwhat;
                   2973: -                        ppush(pr, processes[pr], (int) at->transf);
                   2974: -                        setpars(&(tbl[tb].calls[n]), reftasks[m], pr);
                   2975: -                        setlvars(reftasks[m], pr);
                   2976: -                        processes[pr] = reftasks[m];
                   2977: -                        fiddler(pr);
                   2978: -                        state[pr] = 0;
                   2979: -                        muststore = tbl[processes[pr]].labrow[0];
                   2980: -                        return TC;
                   2981: -              case TMO: send(m, from, NONE, pr, at->transf);
                   2982: -                        receive(from, NONE, pr, ice);
                   2983: -                        lastqueue = (short) from;
                   2984: -                        how = TO;
                   2985: -                        break;
                   2986: -              case DFL:
                   2987: -              case INP: receive(from, (int) at->valtrans, pr, ice);
                   2988: -                        how = RO;
                   2989: -                        break;
                   2990: -              case OUTP: send(m, from, (int) at->valtrans, pr, at->transf);
                   2991: -                        lastqueue = (short) from;
                   2992: -                        how |= SO;
                   2993: -                        break;
                   2994: -      }
                   2995: -      state[pr] = (int) at->transf;
                   2996: -      muststore = tbl[processes[pr]].labrow[state[pr]];
                   2997: -
                   2998: -      return (how);
                   2999: -}
                   3000: -
                   3001: -backup(k, how, bx, i, ice)
                   3002: -      struct FREEZE *ice;
                   3003: -{ int u = (int) ice->whichvar;
                   3004: -
                   3005: -      if (u != NONE)
                   3006: -      {       if (u >= MANY)
                   3007: -                      procpars[i].lvarvals[u-MANY] = ice->oldvalue;
                   3008: -              else
                   3009: -                      globvars[u] = ice->oldvalue;
                   3010: -      }
                   3011: -      switch (how) {
                   3012: -              case TC: u = processes[i];
                   3013: -                       processes[i] = ppop(i);
                   3014: -                       fiddler(i);
                   3015: -                       break;
                   3016: -              case TO: unrecv(bx);
                   3017: -              case SO: unsend();
                   3018: -                       peekassert(ice);
                   3019: -                       break;
                   3020: -              case SR: unsend();
                   3021: -              case RO: unrecv(bx);
                   3022: -                       peekassert(ice);
                   3023: -              default: break;
                   3024: -      } state[i] = k;
                   3025: -}
                   3026: -
                   3027: -fiddler(pr)
                   3028: -{ register int i, t = processes[pr];
                   3029: -
                   3030: -      for (i = 0; i < tbl[t].nrcols; i++)
                   3031: -              if (tbl[t].colmap[i] >= MANY)
                   3032: -              {       lbt[pr].mapcol[i] = mapper(tbl[t].colmap[i], pr);
                   3033: -                      lbt[pr].orgcol[i] = whichq(lbt[pr].mapcol[i]);
                   3034: -              } else
                   3035: -              {       lbt[pr].mapcol[i] = tbl[t].colmap[i];
                   3036: -                      lbt[pr].orgcol[i] = tbl[t].colorg[i];
                   3037: -              }
                   3038: -      
                   3039: -}
                   3040: //GO.SYSIN DD trace3.c
                   3041: echo trace4.c 1>&2
                   3042: sed 's/.//' >trace4.c <<'//GO.SYSIN DD trace4.c'
                   3043: -#include <stdio.h>
                   3044: -#include "trace.h"
                   3045: -#include "trace.d"
                   3046: -
                   3047: - extern char lockplus, prefix;
                   3048: - extern struct QUEUE *s_last;
                   3049: - extern int *processes, *globvars, *state, *qsize;
                   3050: - extern int nrprocs, nrrefs, nrvars, nrqs, level, assertbl, nrtbl;
                   3051: - extern long loopsf, zapped;
                   3052: - extern struct TBL *tbl;
                   3053: - extern struct PROCSTACK **procstack;
                   3054: - extern struct VARPARS *procpars;
                   3055: -
                   3056: - short *Factor, maxr = 0;
                   3057: - double iseen=0, ireseen=0, painful=0, kurshan=0;
                   3058: -
                   3059: - struct VISIT *lastvisit;
                   3060: - struct STATE *giveme(), *setstate();
                   3061: - char *Smalloc(), *emalloc();
                   3062: -
                   3063: -struct STATE *
                   3064: -inloop()
                   3065: -{ struct STATE *tmp;
                   3066: -  register struct VISIT *hook;
                   3067: -  register int x; char aa;
                   3068: -  int i, nrnonempty=0, nrnon=0;
                   3069: -  short h, hashvalue();
                   3070: -
                   3071: -      for (i = 0; i < nrqs; i++)
                   3072: -              if (qsize[i] > 0)
                   3073: -              {       nrnonempty += (1<<i);
                   3074: -                      nrnon++;
                   3075: -              }
                   3076: -      h = hashvalue(nrnonempty);
                   3077: -      for (x = member(h); x > 0; x--)
                   3078: -      {       tmp = giveme(h, x);
                   3079: -              if (samestate(tmp))
                   3080: -              {       for (hook = tmp->next; hook != NULL; hook = hook->next)
                   3081: -                      {
                   3082: -                              if (hook->howmany != nrnonempty
                   3083: -                              || !Queuesmatch(hook, nrnon))
                   3084: -                                      continue;
                   3085: -
                   3086: -                              if (ISANA(hook))
                   3087: -                              {       if (DEPTH(hook) > level)
                   3088: -                                      {       painful += 1;
                   3089: -                                              continue;
                   3090: -                                      }
                   3091: -                                      if (prefix)
                   3092: -                                              output("prefix: ", 0);
                   3093: -                                      hook->prop.countme += 1;
                   3094: -                                      kurshan += (double) 1;
                   3095: -                                      return NULL;
                   3096: -                              } else
                   3097: -                              {       loopsf++;
                   3098: -                                      aa = (assertbl == NONE)? 1 : assertholds();
                   3099: -                                      if (aa == 0 || lockplus)
                   3100: -                                              putloop(hook->prop.s, aa);
                   3101: -                                      return NULL;
                   3102: -                      }       }
                   3103: -                      return setstate(tmp, h);
                   3104: -              }
                   3105: -      }
                   3106: -      return setstate((struct STATE *) NULL, h);
                   3107: -}
                   3108: -
                   3109: -cmplvars(one, two)
                   3110: -      struct LOCVARS *one;
                   3111: -      struct VARPARS *two;
                   3112: -{ int i;
                   3113: -
                   3114: -      if (one->nrlvars != two->nrlvars)
                   3115: -              return 0;
                   3116: -
                   3117: -      for (i = 0; i < one->nrlvars; i++)
                   3118: -              if (one->lvarvals[i] != two->lvarvals[i])
                   3119: -                      return 0;
                   3120: -
                   3121: -      return 1;
                   3122: -}
                   3123: -
                   3124: -cmplocals(one, two)
                   3125: -      struct VARPARS *one, *two;
                   3126: -{ int i;
                   3127: -
                   3128: -      if (one->nrlvars != two->nrlvars)
                   3129: -              return 0;
                   3130: -
                   3131: -      for (i = 0; i < one->nrlvars; i++)
                   3132: -              if (one->lvarvals[i] != two->lvarvals[i])
                   3133: -                      return 0;
                   3134: -
                   3135: -      return 1;
                   3136: -}
                   3137: -
                   3138: -cmparams(one, two)
                   3139: -      struct VARPARS *one, *two;
                   3140: -{ int i;
                   3141: -
                   3142: -      if (one->nrms != two->nrms || one->nrvs != two->nrvs)
                   3143: -              whoops("cannot happen - cmparams");
                   3144: -
                   3145: -      for (i = 0; i < one->nrms; i++)
                   3146: -              if (one->ms[i] != two->ms[i])
                   3147: -                      return 0;
                   3148: -
                   3149: -      for (i = 0; i < one->nrvs; i++)
                   3150: -              if (one->vs[i] != two->vs[i])
                   3151: -                      return 0;
                   3152: -
                   3153: -      return 1;
                   3154: -}
                   3155: -
                   3156: -cmpstacks(older, newer)
                   3157: -      struct PROCSTACK *older, *newer;
                   3158: -{ struct PROCSTACK *tmp1 = older;
                   3159: -  struct PROCSTACK *tmp2 = newer;
                   3160: -
                   3161: -      while (tmp2 != NULL)
                   3162: -      {       
                   3163: -              if (tmp1->uptable  != tmp2->uptable
                   3164: -              ||  tmp1->uptransf != tmp2->uptransf)
                   3165: -                      return 0;
                   3166: -
                   3167: -              if (cmplocals(tmp1->varparsaved, tmp2->varparsaved) == 0
                   3168: -              ||  cmparams (tmp1->varparsaved, tmp2->varparsaved) == 0)
                   3169: -                      return 0;
                   3170: -
                   3171: -              tmp1 = tmp1->follow;
                   3172: -              tmp2 = tmp2->follow;
                   3173: -      }
                   3174: -      return 1;
                   3175: -}
                   3176: -
                   3177: -samestate(at)
                   3178: -      struct STATE *at;
                   3179: -{
                   3180: -      return (sameP(at->pstate) && sametempl(at->pcon));
                   3181: -}
                   3182: -
                   3183: -cpylvars(into, from)
                   3184: -      struct LOCVARS  *into;
                   3185: -      struct VARPARS *from;
                   3186: -{ register int i;
                   3187: -
                   3188: -      into->nrlvars = from->nrlvars;
                   3189: -      into->lvarvals = (short *)
                   3190: -              Smalloc(from->nrlvars * sizeof(short));
                   3191: -      for (i = 0; i < from->nrlvars; i++)
                   3192: -              into->lvarvals[i] = from->lvarvals[i];
                   3193: -}
                   3194: -
                   3195: -cpylocals(into, from)
                   3196: -      struct VARPARS *into, *from;
                   3197: -{ register int i;
                   3198: -
                   3199: -      into->nrlvars = from->nrlvars;
                   3200: -      into->lvarvals = (short *)
                   3201: -              Smalloc(from->nrlvars * sizeof(short));
                   3202: -      for (i = 0; i < from->nrlvars; i++)
                   3203: -              into->lvarvals[i] = from->lvarvals[i];
                   3204: -}
                   3205: -
                   3206: -cpyparams(into, from)
                   3207: -      struct VARPARS *into, *from;
                   3208: -{ int i;
                   3209: -
                   3210: -      into->nrms = from->nrms;
                   3211: -      into->ms = (short *)
                   3212: -              Smalloc(from->nrms * sizeof(short));
                   3213: -      for (i = 0; i < from->nrms; i++)
                   3214: -              into->ms[i] = from->ms[i];
                   3215: -
                   3216: -      into->nrvs = from->nrvs;
                   3217: -      into->vs = (short *)
                   3218: -              Smalloc(from->nrvs * sizeof(short));
                   3219: -      for (i = 0; i < from->nrvs; i++)
                   3220: -              into->vs[i] = from->vs[i];
                   3221: -}
                   3222: -
                   3223: -cpystacks(left, right)
                   3224: -      struct PROCSTACK *left, *right;
                   3225: -{ struct PROCSTACK *into = left;
                   3226: -  struct PROCSTACK *from = right;
                   3227: -
                   3228: -      while (from != NULL)
                   3229: -      {       into->varparsaved = (struct VARPARS *)
                   3230: -                      Smalloc(sizeof(struct VARPARS));
                   3231: -              cpylocals(into->varparsaved, from->varparsaved);
                   3232: -              cpyparams(into->varparsaved, from->varparsaved);
                   3233: -
                   3234: -              into->uptable  = from->uptable;
                   3235: -              into->uptransf = from->uptransf;
                   3236: -
                   3237: -              if ((from = from->follow) != NULL)
                   3238: -              {       into->follow = (struct PROCSTACK *)
                   3239: -                              Smalloc(sizeof(struct PROCSTACK));
                   3240: -                      into = into->follow;
                   3241: -      }       }
                   3242: -}
                   3243: -
                   3244: -struct STATE *
                   3245: -newstate(pha)
                   3246: -      int pha;
                   3247: -{ struct STATE *hook;
                   3248: -  struct VISIT *findastate();
                   3249: -  struct TEMPLATE *inTtable();
                   3250: -  unsigned short *inPtable();
                   3251: -
                   3252: -      hook = (struct STATE *) Smalloc(sizeof(struct STATE));
                   3253: -      hook->pstate = inPtable();
                   3254: -      hook->pcon   = inTtable();
                   3255: -      hook->next   = findastate(hook);        /* first visit */
                   3256: -
                   3257: -      insert(pha, hook);
                   3258: -
                   3259: -      return hook;
                   3260: -}
                   3261: -
                   3262: -struct VISIT *
                   3263: -oldstate(where)
                   3264: -      struct STATE *where;
                   3265: -{ register struct VISIT *tmp;
                   3266: -  struct VISIT *try, *findastate();
                   3267: -
                   3268: -      ireseen += (double)1;
                   3269: -      try = findastate(where);
                   3270: -      
                   3271: -      if (where->next == NULL)
                   3272: -              where->next = try;
                   3273: -      else
                   3274: -      {       for (tmp = where->next; tmp->next != NULL; tmp = tmp->next)
                   3275: -                      ;
                   3276: -              tmp->next = try;
                   3277: -      }
                   3278: -
                   3279: -      return try;
                   3280: -}
                   3281: -
                   3282: -struct STATE *
                   3283: -setstate(where, ha)
                   3284: -      struct STATE *where;
                   3285: -{ struct STATE *tmp;
                   3286: -  struct VISIT *work;
                   3287: -
                   3288: -      if (where == NULL)
                   3289: -      {       tmp = newstate(ha);
                   3290: -              work = tmp->next;
                   3291: -      } else
                   3292: -      {       tmp = where;
                   3293: -              work = oldstate(where);
                   3294: -      }
                   3295: -
                   3296: -      work->prop.s = s_last;
                   3297: -      work->depth = (short) level;
                   3298: -
                   3299: -      lastvisit = work;
                   3300: -      relink(work);
                   3301: -
                   3302: -      return tmp;
                   3303: -}
                   3304: -
                   3305: -struct VISIT *
                   3306: -pickstate(at)
                   3307: -      struct STATE *at;
                   3308: -{ struct VISIT *latter = NULL;
                   3309: -  register struct VISIT *hook = at->next;
                   3310: -
                   3311: -      for (hook = at->next; hook != NULL; hook = hook->next)
                   3312: -      {       if (ISANA(hook))
                   3313: -              {       if (latter == NULL)
                   3314: -                              at->next = hook->next;
                   3315: -                      else
                   3316: -                              latter->next = hook->next;
                   3317: -
                   3318: -                      efree(hook->c);
                   3319: -                      hook->next = NULL;
                   3320: -                      zapped++;
                   3321: -
                   3322: -                      return hook;
                   3323: -              }
                   3324: -              latter = hook;
                   3325: -      }
                   3326: -      return NULL;
                   3327: -}
                   3328: -
                   3329: -struct VISIT *
                   3330: -picknown(at, want)
                   3331: -      struct STATE *at;
                   3332: -      struct VISIT *want;
                   3333: -{ struct VISIT *latter = NULL;
                   3334: -  register struct VISIT *hook;
                   3335: -
                   3336: -      for (hook = at->next; hook != NULL; hook = hook->next)
                   3337: -      {       if (hook == want)
                   3338: -                      break;
                   3339: -              latter = hook;
                   3340: -      }
                   3341: -      if (hook == NULL)
                   3342: -              whoops("cannot happen - picknown");
                   3343: -
                   3344: -      if (latter == NULL)
                   3345: -              at->next = hook->next;
                   3346: -      else
                   3347: -              latter->next = hook->next;
                   3348: -
                   3349: -      efree(hook->c);
                   3350: -      hook->next = NULL;
                   3351: -
                   3352: -      zapped++;
                   3353: -      return hook;
                   3354: -}
                   3355: -
                   3356: -inihash()
                   3357: -{ register int i;
                   3358: -  char *Smalloc();
                   3359: -
                   3360: -      for (i = 0; i < nrtbl; i++)
                   3361: -              if (tbl[i].nrrows > maxr)
                   3362: -                      maxr = tbl[i].nrrows;
                   3363: -
                   3364: -      Factor = (short *)
                   3365: -              Smalloc(maxr * sizeof(short));
                   3366: -
                   3367: -      for (i = 0; i < maxr; i++)
                   3368: -              Factor[i] = rand()%NOTOOBIG;    /* number between 0 and 16k */
                   3369: -}
                   3370: -
                   3371: -short
                   3372: -hashvalue(g)
                   3373: -{ register int i, h;
                   3374: -
                   3375: -      for (i = h = 0; i < nrprocs; i++)
                   3376: -      {       h = ((h << 2) | (h >> 13));     /* rotate */
                   3377: -              h ^= Factor[state[i]] ^ Factor[processes[i]];
                   3378: -      }
                   3379: -      h += g;
                   3380: -      return (h & NOTOOBIG);
                   3381: -}
                   3382: //GO.SYSIN DD trace4.c
                   3383: echo trace5.c 1>&2
                   3384: sed 's/.//' >trace5.c <<'//GO.SYSIN DD trace5.c'
                   3385: -#include <stdio.h>
                   3386: -#include "trace.h"
                   3387: -#include "trace.d"
                   3388: -
                   3389: - extern struct QUEUE **head, **tail;
                   3390: - extern int *qsize, nrqs, level, maxreached;
                   3391: - extern double iseen, ireseen, zapper;
                   3392: - extern double tryswiff, noswiff, cannot;
                   3393: - char *Realloc(), *Emalloc(), *Smalloc(), *emalloc();
                   3394: -
                   3395: - struct HTABLE {
                   3396: -      struct STATE **index;           /* index [h] [ibound]    */
                   3397: -      short ibound;                   /* nr of available slots */
                   3398: -      short nr;                       /* nr of occupied  slots */
                   3399: - } oldstates[NOTOOBIG+1];             /* index of hash values  */
                   3400: -
                   3401: - int hbound=0, hlast=0;
                   3402: -
                   3403: -growindex(h)
                   3404: -{ int nsz = (int) oldstates[h].ibound + 8;
                   3405: -
                   3406: -      if (nsz == 8)
                   3407: -              oldstates[h].index = (struct STATE **)
                   3408: -                      Emalloc(nsz * sizeof(struct STATE *));
                   3409: -      else
                   3410: -              oldstates[h].index = (struct STATE **)
                   3411: -                      Realloc(oldstates[h].index, nsz * sizeof(struct STATE *));
                   3412: -      
                   3413: -      oldstates[h].ibound = (short) nsz;
                   3414: -}
                   3415: -
                   3416: -initable()
                   3417: -{     register int i;
                   3418: -
                   3419: -      for (i = 0; i < NOTOOBIG+1; i++)
                   3420: -      {       oldstates[i].nr = 0;
                   3421: -              oldstates[i].ibound = 0;
                   3422: -      }
                   3423: -      hbound = NOTOOBIG+1;
                   3424: -}
                   3425: -
                   3426: -insert(h, pnt)                /* enter state pointer into the table at hash value h */
                   3427: -      struct STATE *pnt;
                   3428: -{ short cin;
                   3429: -
                   3430: -      if (h >= hbound)
                   3431: -      {       fprintf(stderr, "h %d, hbound %d, NOTOOBIG %d\n",h,hbound,NOTOOBIG);
                   3432: -              whoops("cannot happen - insert");
                   3433: -      }
                   3434: -      cin = oldstates[h].nr++;
                   3435: -      iseen += (double) 1;
                   3436: -
                   3437: -      if (cin >= oldstates[h].ibound)
                   3438: -              growindex(h);
                   3439: -
                   3440: -      oldstates[h].index[cin] = pnt;
                   3441: -}
                   3442: -
                   3443: -mark(stt, vis)
                   3444: -      struct STATE *stt;
                   3445: -      struct VISIT *vis;
                   3446: -{
                   3447: -      vis->prop.countme = 0;
                   3448: -      vis->depth |= ANALYZED;
                   3449: -}
                   3450: -
                   3451: -relink(vis)
                   3452: -      struct VISIT *vis;
                   3453: -{ struct CONTS *inqtable();
                   3454: -  register int i, j, k;
                   3455: -
                   3456: -      for (i = j = k = 0; i < nrqs ; i++)
                   3457: -              if (qsize[i] > 0)
                   3458: -              {       j++;
                   3459: -                      k += (1 << i);
                   3460: -              }
                   3461: -      vis->howmany = k;
                   3462: -
                   3463: -      if (zapper == 0)        /* grow without bound */
                   3464: -              vis->c = (struct CONTS **)
                   3465: -                      Smalloc(j * sizeof(struct CONTS *));
                   3466: -      else
                   3467: -              vis->c = (struct CONTS **)
                   3468: -                      emalloc(j * sizeof(struct CONTS *));
                   3469: -
                   3470: -      for (i = k = 0; i < nrqs; i++)
                   3471: -      {       if (qsize[i] == 0)
                   3472: -                      continue;
                   3473: -
                   3474: -              vis->c[k++] = inqtable(i);
                   3475: -      }
                   3476: -}
                   3477: -
                   3478: -member(h) {   return (h < hbound) ? oldstates[h].nr : 0; }
                   3479: -
                   3480: -struct STATE *
                   3481: -giveme(h, n)
                   3482: -{ int m = n - 1;
                   3483: -      if (h >= hbound || oldstates[h].nr <= m || oldstates[h].index[m] == NULL)
                   3484: -              whoops("cannot happen - giveme");
                   3485: -
                   3486: -      return oldstates[h].index[m];
                   3487: -}
                   3488: -
                   3489: -struct VISIT *
                   3490: -findany(avoid)
                   3491: -      struct STATE *avoid;
                   3492: -{ register int i, j;
                   3493: -  struct VISIT *try, *pickstate();
                   3494: -
                   3495: -      for (i = (hlast+1)%hbound; i != hlast; i++, i %= hbound)
                   3496: -      for (j = 0; j < oldstates[i].nr; j++)
                   3497: -              if (oldstates[i].index[j] != avoid
                   3498: -              &&  (try = pickstate(oldstates[i].index[j])) != NULL)
                   3499: -              {       hlast = i;
                   3500: -                      return try;
                   3501: -              }
                   3502: -
                   3503: -      cannot += (double) 1;   /* couldn't find a victim */
                   3504: -      try = (struct VISIT *) Smalloc(sizeof(struct VISIT));
                   3505: -      try->next = NULL;
                   3506: -
                   3507: -      return try;
                   3508: -}
                   3509: -
                   3510: -struct VISIT *
                   3511: -findastate(avoid)
                   3512: -      struct STATE *avoid;
                   3513: -{ struct VISIT *try = NULL;
                   3514: -  struct VISIT *findany(), *picknown();
                   3515: -  struct Swiffle *unswiffle(), *trs;
                   3516: -
                   3517: -      if (ireseen < zapper || zapper == 0)
                   3518: -      {       try = (struct VISIT *) Smalloc(sizeof(struct VISIT));
                   3519: -              try->next = NULL;
                   3520: -              return try;
                   3521: -      }
                   3522: -      tryswiff += (double) 1;
                   3523: -      if ((trs = unswiffle(avoid)) != NULL
                   3524: -      && (try = picknown(trs->st, trs->vi)) != NULL)
                   3525: -              return try;
                   3526: -      noswiff += (double) 1;
                   3527: -
                   3528: -      return findany(avoid);
                   3529: -}
                   3530: //GO.SYSIN DD trace5.c
                   3531: echo trace6.c 1>&2
                   3532: sed 's/.//' >trace6.c <<'//GO.SYSIN DD trace6.c'
                   3533: -#include <stdio.h>
                   3534: -#include "trace.h"
                   3535: -#include "trace.d"
                   3536: -
                   3537: - extern struct QUEUE **head, **tail;
                   3538: - extern int *qsize, nrqs, level;
                   3539: -
                   3540: - char *Realloc(), *Emalloc(), *Smalloc();
                   3541: -
                   3542: - struct CONTS ***oldqueues;           /* index of queue states */
                   3543: - long *nrqstates, *qbound;
                   3544: -
                   3545: -iniqtable()
                   3546: -{ register int i;
                   3547: -      nrqstates = (long *)
                   3548: -              Smalloc(nrqs * sizeof(long));
                   3549: -      qbound = (long *)
                   3550: -              Smalloc(nrqs * sizeof(long));
                   3551: -
                   3552: -      oldqueues = (struct CONTS ***)
                   3553: -              Smalloc(nrqs * sizeof(struct CONTS **));
                   3554: -
                   3555: -      for (i = 0; i < nrqs; i++)
                   3556: -              nrqstates[i] = qbound[i] = 0;
                   3557: -}
                   3558: -
                   3559: -growqtable(p)
                   3560: -{ int nsz = qbound[p] + 32;
                   3561: -
                   3562: -      if (nsz == 32)
                   3563: -              oldqueues[p] = (struct CONTS **)
                   3564: -                      Emalloc(nsz * sizeof(struct CONTS *));
                   3565: -      else
                   3566: -              oldqueues[p] = (struct CONTS **)
                   3567: -                      Realloc(oldqueues[p], nsz * sizeof(struct CONTS *));
                   3568: -      
                   3569: -      qbound[p] = nsz;
                   3570: -}
                   3571: -
                   3572: -struct CONTS *
                   3573: -Qinsert(p)
                   3574: -{ struct CONTS * try;
                   3575: -  struct QUEUE * tmp;
                   3576: -  register int i, j;
                   3577: -
                   3578: -      i = p;
                   3579: -      j = qsize[p];
                   3580: -
                   3581: -      if (nrqstates[p] >= qbound[p])
                   3582: -              growqtable(p);
                   3583: -
                   3584: -      try = (struct CONTS *)
                   3585: -              Smalloc((j+1) * sizeof(struct CONTS));
                   3586: -
                   3587: -      try[0].mesg  = i;
                   3588: -      try[0].cargo = j;
                   3589: -
                   3590: -      for (tmp = head[i], j = 1; tmp != tail[i]; tmp = tmp->next, j++)
                   3591: -      {       try[j].mesg  = (tmp->mesg & ~PASSED);
                   3592: -              try[j].cargo = tmp->cargo;
                   3593: -      }
                   3594: -
                   3595: -      if (--j != qsize[p])
                   3596: -              whoops("cannot happen - Qinsert");
                   3597: -
                   3598: -      oldqueues[p][nrqstates[p]] = try;
                   3599: -      nrqstates[p] += 1;
                   3600: -
                   3601: -      return try;
                   3602: -}
                   3603: -
                   3604: -struct CONTS *
                   3605: -inqtable(p)
                   3606: -{     register int i;
                   3607: -
                   3608: -      if (qsize[p] == 0)
                   3609: -              whoops("cannot happen - inqtable");
                   3610: -
                   3611: -      for (i = 0; i < nrqstates[p]; i++)
                   3612: -              if (samequeue(oldqueues[p][i]))
                   3613: -                      return oldqueues[p][i];
                   3614: -
                   3615: -      return Qinsert(p);
                   3616: -}
                   3617: -
                   3618: -samequeue(at)
                   3619: -      struct CONTS *at;
                   3620: -{
                   3621: -      register struct QUEUE *tmp;
                   3622: -      register int j, k, m;
                   3623: -
                   3624: -      k = at[0].mesg;         /* which queue is this */
                   3625: -      m = at[0].cargo;        /* how many elements are here */
                   3626: -
                   3627: -      if (qsize[k] != m)
                   3628: -              return 0;
                   3629: -
                   3630: -      for (tmp = head[k], j = 1; tmp != tail[k]; tmp = tmp->next, j++)
                   3631: -      {       if (at[j].mesg  != (tmp->mesg & ~PASSED)
                   3632: -              ||  at[j].cargo != tmp->cargo)
                   3633: -                      return 0;
                   3634: -      }
                   3635: -      return 1;
                   3636: -}
                   3637: -
                   3638: -Queuesmatch(vis, k)
                   3639: -      struct VISIT *vis;
                   3640: -      register int k;
                   3641: -{
                   3642: -      register int i;
                   3643: -
                   3644: -      for (i = 0; i < k; i++)
                   3645: -              if (samequeue(vis->c[i]) == 0)
                   3646: -                      return 0;
                   3647: -      return 1;
                   3648: -}
                   3649: //GO.SYSIN DD trace6.c
                   3650: echo trace7.c 1>&2
                   3651: sed 's/.//' >trace7.c <<'//GO.SYSIN DD trace7.c'
                   3652: -#include <stdio.h>
                   3653: -#include "trace.h"
                   3654: -#include "trace.d"
                   3655: -
                   3656: -struct Swiffle *slist, *slast, *flast;
                   3657: -int nswiff = 0, fswiff = 0;
                   3658: -
                   3659: -struct Swiffle *
                   3660: -unswiffle(avoid)
                   3661: -      struct STATE *avoid;
                   3662: -{
                   3663: -      register struct Swiffle *try;
                   3664: -      register int i;
                   3665: -      struct Swiffle *result = (struct Swiffle *) NULL;
                   3666: -
                   3667: -      for (i = nswiff, try = slist; i > 0; i--, try = try->next)
                   3668: -              if (try->st != avoid)
                   3669: -              {       result = try;
                   3670: -                      getput(try, i);
                   3671: -                      break;
                   3672: -              }
                   3673: -
                   3674: -      return result;
                   3675: -}
                   3676: -
                   3677: -swiffle(this, that)
                   3678: -      struct STATE *this;
                   3679: -      struct VISIT *that;
                   3680: -{
                   3681: -      struct Swiffle *getswiff(), *try;
                   3682: -
                   3683: -      try = getswiff();
                   3684: -      try->st = this;
                   3685: -      try->vi = that;
                   3686: -
                   3687: -      if (nswiff++ == 0)
                   3688: -              slist = try;
                   3689: -      else
                   3690: -      {       slast->next = try;
                   3691: -              try->last = slast;
                   3692: -      }
                   3693: -      slast = try;
                   3694: -}
                   3695: -
                   3696: -getput(try, n)
                   3697: -      struct Swiffle *try;
                   3698: -{
                   3699: -/* unlink from slist: */
                   3700: -      if (try == slist)
                   3701: -              slist = try->next;
                   3702: -      else
                   3703: -              try->last->next = try->next;
                   3704: -
                   3705: -      if (n > 1)
                   3706: -              try->next->last = try->last;
                   3707: -
                   3708: -      if (try == slast)
                   3709: -      {       if (try == slist)
                   3710: -                      slast = (struct Swiffle *) NULL;
                   3711: -              else
                   3712: -                      slast = try->last;
                   3713: -      }
                   3714: -      nswiff--;
                   3715: -
                   3716: -/* relink in flist: */
                   3717: -
                   3718: -      try->next = (struct Swiffle *) NULL;
                   3719: -
                   3720: -      if (fswiff++ == 0)
                   3721: -              try->last = (struct Swiffle *) NULL;
                   3722: -      else
                   3723: -      {       flast->next = try;
                   3724: -              try->last = flast;
                   3725: -      }
                   3726: -      flast = try;
                   3727: -}
                   3728: -
                   3729: -struct Swiffle *
                   3730: -getswiff()
                   3731: -{     struct Swiffle *try;
                   3732: -      char *Smalloc();
                   3733: -
                   3734: -      if (fswiff == 0)
                   3735: -              try = (struct Swiffle *) Smalloc(sizeof(struct Swiffle));
                   3736: -      else
                   3737: -      {       fswiff--;
                   3738: -              try = flast;
                   3739: -              if ((flast = try->last) != NULL)
                   3740: -                      flast->next = (struct Swiffle *) NULL;
                   3741: -      }
                   3742: -      try->next = try->last = (struct Swiffle *) NULL;
                   3743: -
                   3744: -      return try;
                   3745: -}
                   3746: //GO.SYSIN DD trace7.c
                   3747: echo trace8.c 1>&2
                   3748: sed 's/.//' >trace8.c <<'//GO.SYSIN DD trace8.c'
                   3749: -#include <stdio.h>
                   3750: -#include "trace.h"
                   3751: -#include "trace.d"
                   3752: -
                   3753: - extern int *globvars;
                   3754: - extern int nrprocs, nrrefs, nrvars;
                   3755: - extern struct PROCSTACK **procstack;
                   3756: - extern struct VARPARS *procpars;
                   3757: -
                   3758: - char *Realloc(), *Emalloc(), *Smalloc();
                   3759: -
                   3760: - struct TEMPLATE **templates;
                   3761: - int nrtemplates = 0, tbound = 0;
                   3762: -
                   3763: -growttable()
                   3764: -{ int nsz = tbound + 32;
                   3765: -
                   3766: -      if (nsz == 32)
                   3767: -              templates = (struct TEMPLATE **)
                   3768: -                      Emalloc(nsz * sizeof(struct TEMPLATE *));
                   3769: -      else
                   3770: -              templates = (struct TEMPLATE **)
                   3771: -                      Realloc(templates, nsz * sizeof(struct TEMPLATE *));
                   3772: -      
                   3773: -      tbound = nsz;
                   3774: -
                   3775: -}
                   3776: -
                   3777: -struct TEMPLATE *
                   3778: -Tinsert()
                   3779: -{ struct TEMPLATE *try;
                   3780: -  register int i;
                   3781: -
                   3782: -      if (nrtemplates >= tbound)
                   3783: -              growttable();
                   3784: -
                   3785: -      try = (struct TEMPLATE *)
                   3786: -              Smalloc(sizeof(struct TEMPLATE));
                   3787: -      try->l_vars = (struct LOCVARS **)
                   3788: -              Smalloc(nrprocs * sizeof(struct LOCVARS *));
                   3789: -      try->g_vars = (short *)
                   3790: -              Smalloc(nrvars * sizeof(short));
                   3791: -
                   3792: -      for (i = 0; i < nrvars; i++)
                   3793: -              try->g_vars[i] = (short) globvars[i];
                   3794: -
                   3795: -      if (nrrefs > 0)
                   3796: -              try->traceback = (struct PROCSTACK **)
                   3797: -                      Smalloc(nrprocs * sizeof(struct PROCSTACK *));
                   3798: -
                   3799: -      for (i = 0; i < nrprocs; i++)
                   3800: -      {       try->l_vars[i] = (struct LOCVARS *)
                   3801: -                      Smalloc(sizeof(struct LOCVARS));
                   3802: -
                   3803: -              cpylvars(try->l_vars[i], &(procpars[i]));
                   3804: -
                   3805: -              if (nrrefs > 0)
                   3806: -              {       if (procstack[i] == NULL)
                   3807: -                      {       try->traceback[i] = NULL;
                   3808: -                              continue;
                   3809: -                      }
                   3810: -                      try->traceback[i] = (struct PROCSTACK *)
                   3811: -                              Smalloc(sizeof(struct PROCSTACK));
                   3812: -                      cpystacks(try->traceback[i], procstack[i]);
                   3813: -      }       }
                   3814: -
                   3815: -      templates[nrtemplates] = try;
                   3816: -      nrtemplates++;
                   3817: -
                   3818: -      return try;
                   3819: -}
                   3820: -
                   3821: -struct TEMPLATE *
                   3822: -inTtable()
                   3823: -{ register int i;
                   3824: -
                   3825: -      for (i = 0; i < nrtemplates; i++)
                   3826: -              if (sametempl(templates[i]))
                   3827: -                      return templates[i];
                   3828: -
                   3829: -      return Tinsert();
                   3830: -}
                   3831: -
                   3832: -sametempl(at)
                   3833: -      struct TEMPLATE *at;
                   3834: -{ register int i;
                   3835: -
                   3836: -      for (i = 0; i < nrprocs; i++)
                   3837: -      {       if (cmplvars(at->l_vars[i], &(procpars[i])) == 0 ||
                   3838: -                 (nrrefs > 0 && cmpstacks(at->traceback[i], procstack[i]) == 0))
                   3839: -                      return 0;
                   3840: -      }
                   3841: -
                   3842: -      for (i = 0; i < nrvars; i++)
                   3843: -              if (at->g_vars[i] != (short) globvars[i])
                   3844: -                      return 0;
                   3845: -
                   3846: -      return 1;
                   3847: -}
                   3848: //GO.SYSIN DD trace8.c
                   3849: echo trace9.c 1>&2
                   3850: sed 's/.//' >trace9.c <<'//GO.SYSIN DD trace9.c'
                   3851: -#include <stdio.h>
                   3852: -#include "trace.h"
                   3853: -#include "trace.d"
                   3854: -
                   3855: - extern int nrprocs, *processes, *state;
                   3856: -
                   3857: - char *Realloc(), *Emalloc(), *Smalloc();
                   3858: -
                   3859: - unsigned short **pstates;
                   3860: - int pgrowth = 32;
                   3861: - int nrpstates = 0;
                   3862: - int pbound = 0;
                   3863: -
                   3864: -growPtable()
                   3865: -{ int p = pbound + pgrowth;
                   3866: -
                   3867: -      if (p == pgrowth)
                   3868: -              pstates = (unsigned short **)
                   3869: -                      Emalloc(p * sizeof(unsigned short *));
                   3870: -      else
                   3871: -              pstates = (unsigned  short **)
                   3872: -                      Realloc(pstates, p * sizeof(unsigned short *));
                   3873: -      pbound = p;
                   3874: -}
                   3875: -
                   3876: -unsigned short *
                   3877: -Pinsert()
                   3878: -{ unsigned short *try;
                   3879: -  register int i;
                   3880: -
                   3881: -      if (nrpstates >= pbound)
                   3882: -              growPtable();
                   3883: -
                   3884: -      try = (unsigned  short *)
                   3885: -              Smalloc(nrprocs * sizeof(unsigned  short));
                   3886: -
                   3887: -      for (i = 0; i < nrprocs; i++)
                   3888: -              try[i] = (unsigned short) (state[i] + (processes[i]<<10));
                   3889: -
                   3890: -      pstates[nrpstates++] = try;
                   3891: -
                   3892: -      return try;
                   3893: -}
                   3894: -
                   3895: -unsigned  short *
                   3896: -inPtable()
                   3897: -{ register int i;
                   3898: -
                   3899: -      for (i = 0; i < nrpstates; i++)
                   3900: -              if (sameP(pstates[i]))
                   3901: -                      return pstates[i];
                   3902: -
                   3903: -      return Pinsert();
                   3904: -}
                   3905: -
                   3906: -sameP(at)
                   3907: -      unsigned  short *at;
                   3908: -{ register int i;
                   3909: -
                   3910: -      for (i = 0; i < nrprocs; i++)
                   3911: -      {       if ((at[i]&1023) != (unsigned short) state[i]
                   3912: -              ||   at[i]>>10   != (unsigned short) processes[i])
                   3913: -                      return 0;
                   3914: -      }
                   3915: -      return 1;
                   3916: -}
                   3917: //GO.SYSIN DD trace9.c

unix.superglobalmegacorp.com

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