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