|
|
1.1 root 1: #include <stdio.h>
2: #include "pret.h"
3:
4: struct {
5: char name[MAXNAME];
6: char mbox;
7: char status;
8: int qind; /* index!=NONE if q addressed is array */
9: int equa; /* basename match */
10: int code;
11: } mesgtable[MANY];
12:
13: struct QTABLE qtable[NQUEUES];
14:
15: int msize[NQUEUES]; /* mailbox sizes per queue */
16:
17: int msgval = BASEVAL;
18: int nrmesgs = 0;
19: int nrqs = 0;
20:
21: int initable[MANY];
22: int nrinits = 0; /* number initial messages */
23:
24: extern anyerror, pid, rid;
25:
26: newqname(str, mask, lim, qind)
27: char *str;
28: {
29: register int i;
30:
31: if (rid != NONE)
32: { if ((i = Fparname(str, rid, ISQ, NONE, mask, qind)) != -1)
33: return (MANY + i); /* id of qset + offset */
34: }
35: for (i = 0; i < nrqs; i++)
36: if (strcmp(str, qtable[i].name) == 0)
37: break;
38: if (i == nrqs)
39: { if (nrqs >= NQUEUES)
40: whoops("too many queues");
41:
42: qtable[i].owner = (mask == DCL || mask == RFR) ? pid : NONE;
43: qtable[i].limit = (lim == NONE) ? 2 : lim;
44: qtable[i].status = mask;
45: qtable[i].magic = 0;
46: qtable[i].multiple = qind;
47: strcpy(qtable[nrqs++].name, str);
48: } else
49: { if (mask == DCL)
50: { if (qtable[i].status & DCL)
51: yyerror("queue redeclared, %s", str);
52:
53: if (qtable[i].owner == NONE)
54: qtable[i].owner = pid;
55: else if (qtable[i].owner != pid && pid != NONE)
56: warning("queue read by 2 processes", str);
57: qtable[i].limit = lim;
58: qtable[i].multiple = qind;
59: } else if (mask & RFR)
60: { if (qtable[i].owner == NONE)
61: qtable[i].owner = pid;
62:
63: else if (qtable[i].owner != pid)
64: warning("queue read by 2 processes", str);
65: }
66: if ((mask & RFR) || (mask & ADR))
67: { if (qind != qtable[i].multiple
68: && (qind == NONE || qtable[i].multiple == NONE))
69: yyerror("queue indexing error, mesg name, %s", str);
70: }
71: qtable[i].status |= mask;
72: }
73: return i;
74: }
75:
76: addmsg(what, hit, mask, tpp, qind)
77: char *what; char mask;
78: { register int i, j;
79: char str[MAXNAME];
80:
81: if (rid != NONE)
82: { if ((i = Fparname(what, rid, ISM, hit - MANY, mask, qind)) != -1)
83: return (MANY + i);
84: if (hit >= MANY)
85: { yyerror("undeclared message, %s", what);
86: return -1;
87: } }
88:
89: strcpy(str, qtable[hit].name);
90: strcat(str, ":"); strcat(str, what);
91:
92: for (j = 0; j < nrmesgs; j++)
93: { if (strcmp(str, mesgtable[j].name) == 0)
94: break;
95: }
96: for (i = j; i < nrmesgs; i++)
97: if (strcmp(str, mesgtable[i].name) == 0
98: && mesgtable[i].qind == qind)
99: break;
100: if (i == nrmesgs)
101: { if (nrmesgs >= MANY)
102: whoops("too many messages");
103: if (qtable[hit].multiple != qind
104: && (qind == NONE || qtable[hit].multiple == NONE))
105: yyerror("Queue indexing error, qname, %s", str);
106:
107: mesgtable[i].mbox = hit;
108: mesgtable[i].qind = qind;
109: mesgtable[i].status = mask;
110: strcpy(mesgtable[nrmesgs++].name, str);
111: mesgtable[i].code = msgval++;
112: mesgtable[i].equa = mesgtable[j].code;
113: } else
114: mesgtable[i].status |= mask;
115:
116: if (tpp == INITM)
117: initable[nrinits++] = mesgtable[i].code;
118:
119: if (strcmp(what, " any") == 0 && mask == SAR)
120: qtable[hit].magic = 1;
121:
122: return mesgtable[i].code;
123: }
124:
125: isoqs()
126: { int i;
127: for (i = 0; i < nrqs; i++)
128: { if (!(qtable[i].status & DCL))
129: printf("warning: queue `%s' undeclared\n", qtable[i].name);
130: if (qtable[i].owner == NONE)
131: printf("warning: queue `%s' unknown owner\n", qtable[i].name);
132: switch (qtable[i].status) {
133: case 0: /* used to check name existence in qsets */
134: case DCL: printf("%s: isolated queue\n", qtable[i].name);
135: break;
136: case DCL+RFR: printf("%s: queue not addressed\n", qtable[i].name);
137: break;
138: case DCL+ADR: printf("%s: queue is never read\n", qtable[i].name);
139: default: break;
140: }
141: }
142: }
143:
144: silentcheck()
145: { int i, j, k, p;
146: for (i = 0; i < nrqs; i++)
147: { if (msize[i] == 0)
148: continue;
149: k = strlen(qtable[i].name) + 1;
150: for (j = 0; j < nrmesgs; j++)
151: if (mesgtable[j].mbox == i && (p = mesgtable[j].status) != SAR)
152: { switch (p) {
153: case RCV: if (qtable[i].multiple) break;
154: printf("queue %s: ", qtable[i].name);
155: printf("mesg '%s' ", &mesgtable[j].name[k]);
156: printf("is received but not sent\n");
157: anyerror++;
158: break;
159: case SND: if (qtable[i].magic != 0
160: || qtable[i].multiple
161: || strcmp(&mesgtable[j].name[k], " any") == 0)
162: break;
163: printf("queue %s: ", qtable[i].name);
164: printf("mesg '%s' ", &mesgtable[j].name[k]);
165: printf("is sent but not received\n");
166: anyerror++;
167: break;
168: case 0: printf("queue %s: ", qtable[i].name);
169: printf("mesg '%s' ", &mesgtable[j].name[k]);
170: printf("is never used\n");
171: break;
172: }
173: } }
174: }
175:
176: checkqs()
177: { isoqs();
178: silentcheck();
179: }
180:
181: numsorts(fd)
182: FILE *fd;
183: { int i, j;
184:
185: for (i = j = 0; i < nrqs; i++)
186: { if (qtable[i].multiple == NONE)
187: j++;
188: else
189: j += qtable[i].multiple;
190: }
191: fprintf(fd, "%d queues:\n", j);
192: numesgs(fd);
193: for (i = 0; i < nrqs; i++)
194: { fprintf(fd, "%s\t%d/",
195: qtable[i].name, qtable[i].owner);
196: fprintf(fd, "%d/%d/%d: ",
197: qtable[i].limit, msize[i], qtable[i].multiple);
198: for (j = 0; j < nrmesgs; j++)
199: if (mesgtable[j].mbox == i)
200: fprintf(fd, "%d[%d,%d],", mesgtable[j].code,
201: mesgtable[j].qind,
202: mesgtable[j].equa);
203: putc('\n', fd);
204: } }
205:
206: numinits(fd)
207: FILE *fd;
208: { int i;
209: fprintf(fd, "%d inits:\n", nrinits);
210: for (i = 0; i < nrinits; i++)
211: fprintf(fd, "%d,", initable[i]);
212: if (nrinits > 0)
213: putc('\n', fd);
214: }
215:
216: numesgs(fd)
217: FILE *fd;
218: { int i, j;
219: char c;
220:
221: fprintf(fd, "%d messages, base %d:\n", nrmesgs, BASEVAL);
222: for (i = 0; i < nrmesgs; i++)
223: { for (j = 0; (c = mesgtable[i].name[j]) != '\0'; j++)
224: if (c == ':')
225: { j++;
226: break;
227: }
228: if (c == '\0')
229: j = 0;
230:
231: fprintf(fd, "%s ", &mesgtable[i].name[j]);
232: }
233: if (nrmesgs > 0)
234: putc('\n', fd);
235: }
236:
237: prepsorts()
238: { int i, j;
239: for (i = 0; i < nrqs; i++)
240: { msize[i] = 0;
241: for (j = 0; j < nrmesgs; j++)
242: if (mesgtable[j].mbox == i)
243: msize[i]++;
244: }
245: }
246:
247: listqs()
248: { int i, j, k, l, a;
249:
250: for (i = 0; i < nrqs; i++)
251: {
252: if (qtable[i].status & DCL == 0) /* formal q-parameter */
253: continue;
254:
255: printf("\t%2d\t%s", i+1, qtable[i].name);
256: k = strlen(qtable[i].name) + 1;
257: if (qtable[i].multiple != NONE)
258: { printf("[%d], ", qtable[i].multiple);
259: a = (qtable[i].multiple>9)?4:3;
260: } else
261: { printf(", ");
262: a = 0;
263: }
264: for (j = 10; j > k+a; j--) putchar(' ');
265: printf("sort: ");
266:
267: for (j = l = 0; j < nrmesgs; j++)
268: if (mesgtable[j].mbox == i &&
269: strcmp(&mesgtable[j].name[k], " tau") != 0 &&
270: strcmp(&mesgtable[j].name[k], " any") != 0)
271: { if (l++ > 0)
272: printf(", ");
273: printf("%s", &mesgtable[j].name[k]);
274: if ((a = mesgtable[j].qind) != NONE)
275: { if (a < -1)
276: printf("/*%d", -(a+2));
277: else
278: printf("/%d", a);
279: } }
280: printf("\n");
281: }
282: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.