Annotation of researchv10no/cmd/trace/trace4.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include "trace.h"
        !             3: #include "trace.d"
        !             4: 
        !             5:  extern char lockplus, prefix;
        !             6:  extern struct QUEUE *s_last;
        !             7:  extern int *processes, *globvars, *state, *qsize;
        !             8:  extern int nrprocs, nrrefs, nrvars, nrqs, level, assertbl, nrtbl;
        !             9:  extern long loopsf, zapped;
        !            10:  extern struct TBL *tbl;
        !            11:  extern struct PROCSTACK **procstack;
        !            12:  extern struct VARPARS *procpars;
        !            13: 
        !            14:  short *Factor, maxr = 0;
        !            15:  double iseen=0, ireseen=0, painful=0, kurshan=0;
        !            16: 
        !            17:  struct VISIT *lastvisit;
        !            18:  struct STATE *giveme(), *setstate();
        !            19:  char *Smalloc(), *emalloc();
        !            20: 
        !            21: struct STATE *
        !            22: inloop()
        !            23: { struct STATE *tmp;
        !            24:   register struct VISIT *hook;
        !            25:   register int x; char aa;
        !            26:   int i, nrnonempty=0, nrnon=0;
        !            27:   short h, hashvalue();
        !            28: 
        !            29:        for (i = 0; i < nrqs; i++)
        !            30:                if (qsize[i] > 0)
        !            31:                {       nrnonempty += (1<<i);
        !            32:                        nrnon++;
        !            33:                }
        !            34:        h = hashvalue(nrnonempty);
        !            35:        for (x = member(h); x > 0; x--)
        !            36:        {       tmp = giveme(h, x);
        !            37:                if (samestate(tmp))
        !            38:                {       for (hook = tmp->next; hook != NULL; hook = hook->next)
        !            39:                        {
        !            40:                                if (hook->howmany != nrnonempty
        !            41:                                || !Queuesmatch(hook, nrnon))
        !            42:                                        continue;
        !            43: 
        !            44:                                if (ISANA(hook))
        !            45:                                {       if (DEPTH(hook) > level)
        !            46:                                        {       painful += 1;
        !            47:                                                continue;
        !            48:                                        }
        !            49:                                        if (prefix)
        !            50:                                                output("prefix: ", 0);
        !            51:                                        hook->prop.countme += 1;
        !            52:                                        kurshan += (double) 1;
        !            53:                                        return NULL;
        !            54:                                } else
        !            55:                                {       loopsf++;
        !            56:                                        aa = (assertbl == NONE)? 1 : assertholds();
        !            57:                                        if (aa == 0 || lockplus)
        !            58:                                                putloop(hook->prop.s, aa);
        !            59:                                        return NULL;
        !            60:                        }       }
        !            61:                        return setstate(tmp, h);
        !            62:                }
        !            63:        }
        !            64:        return setstate((struct STATE *) NULL, h);
        !            65: }
        !            66: 
        !            67: cmplvars(one, two)
        !            68:        struct LOCVARS *one;
        !            69:        struct VARPARS *two;
        !            70: { int i;
        !            71: 
        !            72:        if (one->nrlvars != two->nrlvars)
        !            73:                return 0;
        !            74: 
        !            75:        for (i = 0; i < one->nrlvars; i++)
        !            76:                if (one->lvarvals[i] != two->lvarvals[i])
        !            77:                        return 0;
        !            78: 
        !            79:        return 1;
        !            80: }
        !            81: 
        !            82: cmplocals(one, two)
        !            83:        struct VARPARS *one, *two;
        !            84: { int i;
        !            85: 
        !            86:        if (one->nrlvars != two->nrlvars)
        !            87:                return 0;
        !            88: 
        !            89:        for (i = 0; i < one->nrlvars; i++)
        !            90:                if (one->lvarvals[i] != two->lvarvals[i])
        !            91:                        return 0;
        !            92: 
        !            93:        return 1;
        !            94: }
        !            95: 
        !            96: cmparams(one, two)
        !            97:        struct VARPARS *one, *two;
        !            98: { int i;
        !            99: 
        !           100:        if (one->nrms != two->nrms || one->nrvs != two->nrvs)
        !           101:                whoops("cannot happen - cmparams");
        !           102: 
        !           103:        for (i = 0; i < one->nrms; i++)
        !           104:                if (one->ms[i] != two->ms[i])
        !           105:                        return 0;
        !           106: 
        !           107:        for (i = 0; i < one->nrvs; i++)
        !           108:                if (one->vs[i] != two->vs[i])
        !           109:                        return 0;
        !           110: 
        !           111:        return 1;
        !           112: }
        !           113: 
        !           114: cmpstacks(older, newer)
        !           115:        struct PROCSTACK *older, *newer;
        !           116: { struct PROCSTACK *tmp1 = older;
        !           117:   struct PROCSTACK *tmp2 = newer;
        !           118: 
        !           119:        while (tmp2 != NULL)
        !           120:        {       
        !           121:                if (tmp1->uptable  != tmp2->uptable
        !           122:                ||  tmp1->uptransf != tmp2->uptransf)
        !           123:                        return 0;
        !           124: 
        !           125:                if (cmplocals(tmp1->varparsaved, tmp2->varparsaved) == 0
        !           126:                ||  cmparams (tmp1->varparsaved, tmp2->varparsaved) == 0)
        !           127:                        return 0;
        !           128: 
        !           129:                tmp1 = tmp1->follow;
        !           130:                tmp2 = tmp2->follow;
        !           131:        }
        !           132:        return 1;
        !           133: }
        !           134: 
        !           135: samestate(at)
        !           136:        struct STATE *at;
        !           137: {
        !           138:        return (sameP(at->pstate) && sametempl(at->pcon));
        !           139: }
        !           140: 
        !           141: cpylvars(into, from)
        !           142:        struct LOCVARS  *into;
        !           143:        struct VARPARS *from;
        !           144: { register int i;
        !           145: 
        !           146:        into->nrlvars = from->nrlvars;
        !           147:        into->lvarvals = (short *)
        !           148:                Smalloc(from->nrlvars * sizeof(short));
        !           149:        for (i = 0; i < from->nrlvars; i++)
        !           150:                into->lvarvals[i] = from->lvarvals[i];
        !           151: }
        !           152: 
        !           153: cpylocals(into, from)
        !           154:        struct VARPARS *into, *from;
        !           155: { register int i;
        !           156: 
        !           157:        into->nrlvars = from->nrlvars;
        !           158:        into->lvarvals = (short *)
        !           159:                Smalloc(from->nrlvars * sizeof(short));
        !           160:        for (i = 0; i < from->nrlvars; i++)
        !           161:                into->lvarvals[i] = from->lvarvals[i];
        !           162: }
        !           163: 
        !           164: cpyparams(into, from)
        !           165:        struct VARPARS *into, *from;
        !           166: { int i;
        !           167: 
        !           168:        into->nrms = from->nrms;
        !           169:        into->ms = (short *)
        !           170:                Smalloc(from->nrms * sizeof(short));
        !           171:        for (i = 0; i < from->nrms; i++)
        !           172:                into->ms[i] = from->ms[i];
        !           173: 
        !           174:        into->nrvs = from->nrvs;
        !           175:        into->vs = (short *)
        !           176:                Smalloc(from->nrvs * sizeof(short));
        !           177:        for (i = 0; i < from->nrvs; i++)
        !           178:                into->vs[i] = from->vs[i];
        !           179: }
        !           180: 
        !           181: cpystacks(left, right)
        !           182:        struct PROCSTACK *left, *right;
        !           183: { struct PROCSTACK *into = left;
        !           184:   struct PROCSTACK *from = right;
        !           185: 
        !           186:        while (from != NULL)
        !           187:        {       into->varparsaved = (struct VARPARS *)
        !           188:                        Smalloc(sizeof(struct VARPARS));
        !           189:                cpylocals(into->varparsaved, from->varparsaved);
        !           190:                cpyparams(into->varparsaved, from->varparsaved);
        !           191: 
        !           192:                into->uptable  = from->uptable;
        !           193:                into->uptransf = from->uptransf;
        !           194: 
        !           195:                if ((from = from->follow) != NULL)
        !           196:                {       into->follow = (struct PROCSTACK *)
        !           197:                                Smalloc(sizeof(struct PROCSTACK));
        !           198:                        into = into->follow;
        !           199:        }       }
        !           200: }
        !           201: 
        !           202: struct STATE *
        !           203: newstate(pha)
        !           204:        int pha;
        !           205: { struct STATE *hook;
        !           206:   struct VISIT *findastate();
        !           207:   struct TEMPLATE *inTtable();
        !           208:   unsigned short *inPtable();
        !           209: 
        !           210:        hook = (struct STATE *) Smalloc(sizeof(struct STATE));
        !           211:        hook->pstate = inPtable();
        !           212:        hook->pcon   = inTtable();
        !           213:        hook->next   = findastate(hook);        /* first visit */
        !           214: 
        !           215:        insert(pha, hook);
        !           216: 
        !           217:        return hook;
        !           218: }
        !           219: 
        !           220: struct VISIT *
        !           221: oldstate(where)
        !           222:        struct STATE *where;
        !           223: { register struct VISIT *tmp;
        !           224:   struct VISIT *try, *findastate();
        !           225: 
        !           226:        ireseen += (double)1;
        !           227:        try = findastate(where);
        !           228:        
        !           229:        if (where->next == NULL)
        !           230:                where->next = try;
        !           231:        else
        !           232:        {       for (tmp = where->next; tmp->next != NULL; tmp = tmp->next)
        !           233:                        ;
        !           234:                tmp->next = try;
        !           235:        }
        !           236: 
        !           237:        return try;
        !           238: }
        !           239: 
        !           240: struct STATE *
        !           241: setstate(where, ha)
        !           242:        struct STATE *where;
        !           243: { struct STATE *tmp;
        !           244:   struct VISIT *work;
        !           245: 
        !           246:        if (where == NULL)
        !           247:        {       tmp = newstate(ha);
        !           248:                work = tmp->next;
        !           249:        } else
        !           250:        {       tmp = where;
        !           251:                work = oldstate(where);
        !           252:        }
        !           253: 
        !           254:        work->prop.s = s_last;
        !           255:        work->depth = (short) level;
        !           256: 
        !           257:        lastvisit = work;
        !           258:        relink(work);
        !           259: 
        !           260:        return tmp;
        !           261: }
        !           262: 
        !           263: struct VISIT *
        !           264: pickstate(at)
        !           265:        struct STATE *at;
        !           266: { struct VISIT *latter = NULL;
        !           267:   register struct VISIT *hook = at->next;
        !           268: 
        !           269:        for (hook = at->next; hook != NULL; hook = hook->next)
        !           270:        {       if (ISANA(hook))
        !           271:                {       if (latter == NULL)
        !           272:                                at->next = hook->next;
        !           273:                        else
        !           274:                                latter->next = hook->next;
        !           275: 
        !           276:                        efree(hook->c);
        !           277:                        hook->next = NULL;
        !           278:                        zapped++;
        !           279: 
        !           280:                        return hook;
        !           281:                }
        !           282:                latter = hook;
        !           283:        }
        !           284:        return NULL;
        !           285: }
        !           286: 
        !           287: struct VISIT *
        !           288: picknown(at, want)
        !           289:        struct STATE *at;
        !           290:        struct VISIT *want;
        !           291: { struct VISIT *latter = NULL;
        !           292:   register struct VISIT *hook;
        !           293: 
        !           294:        for (hook = at->next; hook != NULL; hook = hook->next)
        !           295:        {       if (hook == want)
        !           296:                        break;
        !           297:                latter = hook;
        !           298:        }
        !           299:        if (hook == NULL)
        !           300:                whoops("cannot happen - picknown");
        !           301: 
        !           302:        if (latter == NULL)
        !           303:                at->next = hook->next;
        !           304:        else
        !           305:                latter->next = hook->next;
        !           306: 
        !           307:        efree(hook->c);
        !           308:        hook->next = NULL;
        !           309: 
        !           310:        zapped++;
        !           311:        return hook;
        !           312: }
        !           313: 
        !           314: inihash()
        !           315: { register int i;
        !           316:   char *Smalloc();
        !           317: 
        !           318:        for (i = 0; i < nrtbl; i++)
        !           319:                if (tbl[i].nrrows > maxr)
        !           320:                        maxr = tbl[i].nrrows;
        !           321: 
        !           322:        Factor = (short *)
        !           323:                Smalloc(maxr * sizeof(short));
        !           324: 
        !           325:        for (i = 0; i < maxr; i++)
        !           326:                Factor[i] = rand()%NOTOOBIG;    /* number between 0 and 16k */
        !           327: }
        !           328: 
        !           329: short
        !           330: hashvalue(g)
        !           331: { register int i, h;
        !           332: 
        !           333:        for (i = h = 0; i < nrprocs; i++)
        !           334:        {       h = ((h << 2) | (h >> 13));     /* rotate */
        !           335:                h ^= Factor[state[i]] ^ Factor[processes[i]];
        !           336:        }
        !           337:        h += g;
        !           338:        return (h & NOTOOBIG);
        !           339: }

unix.superglobalmegacorp.com

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