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

unix.superglobalmegacorp.com

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