V10/cmd/trace/trace9.c
#include <stdio.h>
#include "trace.h"
#include "trace.d"
extern int nrprocs, *processes, *state;
char *Realloc(), *Emalloc(), *Smalloc();
unsigned short **pstates;
int pgrowth = 32;
int nrpstates = 0;
int pbound = 0;
growPtable()
{ int p = pbound + pgrowth;
if (p == pgrowth)
pstates = (unsigned short **)
Emalloc(p * sizeof(unsigned short *));
else
pstates = (unsigned short **)
Realloc(pstates, p * sizeof(unsigned short *));
pbound = p;
}
unsigned short *
Pinsert()
{ unsigned short *try;
register int i;
if (nrpstates >= pbound)
growPtable();
try = (unsigned short *)
Smalloc(nrprocs * sizeof(unsigned short));
for (i = 0; i < nrprocs; i++)
try[i] = (unsigned short) (state[i] + (processes[i]<<10));
pstates[nrpstates++] = try;
return try;
}
unsigned short *
inPtable()
{ register int i;
for (i = 0; i < nrpstates; i++)
if (sameP(pstates[i]))
return pstates[i];
return Pinsert();
}
sameP(at)
unsigned short *at;
{ register int i;
for (i = 0; i < nrprocs; i++)
{ if ((at[i]&1023) != (unsigned short) state[i]
|| at[i]>>10 != (unsigned short) processes[i])
return 0;
}
return 1;
}