Blame


1 7a4ee46d 2003-11-23 devnull #include "stdinc.h"
2 7a4ee46d 2003-11-23 devnull #include "dat.h"
3 7a4ee46d 2003-11-23 devnull #include "fns.h"
4 7a4ee46d 2003-11-23 devnull
5 7a4ee46d 2003-11-23 devnull typedef struct LumpQueue LumpQueue;
6 7a4ee46d 2003-11-23 devnull typedef struct WLump WLump;
7 7a4ee46d 2003-11-23 devnull
8 7a4ee46d 2003-11-23 devnull enum
9 7a4ee46d 2003-11-23 devnull {
10 7a4ee46d 2003-11-23 devnull MaxLumpQ = 1 << 3 /* max. lumps on a single write queue, must be pow 2 */
11 7a4ee46d 2003-11-23 devnull };
12 7a4ee46d 2003-11-23 devnull
13 7a4ee46d 2003-11-23 devnull struct WLump
14 7a4ee46d 2003-11-23 devnull {
15 7a4ee46d 2003-11-23 devnull Lump *u;
16 7a4ee46d 2003-11-23 devnull Packet *p;
17 7a4ee46d 2003-11-23 devnull int creator;
18 7a4ee46d 2003-11-23 devnull int gen;
19 7a4ee46d 2003-11-23 devnull };
20 7a4ee46d 2003-11-23 devnull
21 7a4ee46d 2003-11-23 devnull struct LumpQueue
22 7a4ee46d 2003-11-23 devnull {
23 7a4ee46d 2003-11-23 devnull QLock lock;
24 7a4ee46d 2003-11-23 devnull Rendez flush;
25 7a4ee46d 2003-11-23 devnull Rendez full;
26 7a4ee46d 2003-11-23 devnull Rendez empty;
27 7a4ee46d 2003-11-23 devnull WLump q[MaxLumpQ];
28 7a4ee46d 2003-11-23 devnull int w;
29 7a4ee46d 2003-11-23 devnull int r;
30 7a4ee46d 2003-11-23 devnull };
31 7a4ee46d 2003-11-23 devnull
32 7a4ee46d 2003-11-23 devnull static LumpQueue *lumpqs;
33 7a4ee46d 2003-11-23 devnull static int nqs;
34 7a4ee46d 2003-11-23 devnull
35 7a4ee46d 2003-11-23 devnull static QLock glk;
36 7a4ee46d 2003-11-23 devnull static int gen;
37 7a4ee46d 2003-11-23 devnull
38 7a4ee46d 2003-11-23 devnull static void queueproc(void *vq);
39 7a4ee46d 2003-11-23 devnull
40 7a4ee46d 2003-11-23 devnull int
41 7a4ee46d 2003-11-23 devnull initlumpqueues(int nq)
42 7a4ee46d 2003-11-23 devnull {
43 7a4ee46d 2003-11-23 devnull LumpQueue *q;
44 7a4ee46d 2003-11-23 devnull
45 7a4ee46d 2003-11-23 devnull int i;
46 7a4ee46d 2003-11-23 devnull nqs = nq;
47 7a4ee46d 2003-11-23 devnull
48 7a4ee46d 2003-11-23 devnull lumpqs = MKNZ(LumpQueue, nq);
49 7a4ee46d 2003-11-23 devnull
50 7a4ee46d 2003-11-23 devnull for(i = 0; i < nq; i++){
51 7a4ee46d 2003-11-23 devnull q = &lumpqs[i];
52 7a4ee46d 2003-11-23 devnull q->full.l = &q->lock;
53 7a4ee46d 2003-11-23 devnull q->empty.l = &q->lock;
54 7a4ee46d 2003-11-23 devnull q->flush.l = &q->lock;
55 7a4ee46d 2003-11-23 devnull
56 7a4ee46d 2003-11-23 devnull if(vtproc(queueproc, q) < 0){
57 7a4ee46d 2003-11-23 devnull seterr(EOk, "can't start write queue slave: %r");
58 7a4ee46d 2003-11-23 devnull return -1;
59 7a4ee46d 2003-11-23 devnull }
60 7a4ee46d 2003-11-23 devnull }
61 7a4ee46d 2003-11-23 devnull
62 7a4ee46d 2003-11-23 devnull return 0;
63 7a4ee46d 2003-11-23 devnull }
64 7a4ee46d 2003-11-23 devnull
65 7a4ee46d 2003-11-23 devnull /*
66 7a4ee46d 2003-11-23 devnull * queue a lump & it's packet data for writing
67 7a4ee46d 2003-11-23 devnull */
68 7a4ee46d 2003-11-23 devnull int
69 7a4ee46d 2003-11-23 devnull queuewrite(Lump *u, Packet *p, int creator)
70 7a4ee46d 2003-11-23 devnull {
71 7a4ee46d 2003-11-23 devnull LumpQueue *q;
72 7a4ee46d 2003-11-23 devnull int i;
73 7a4ee46d 2003-11-23 devnull
74 7a4ee46d 2003-11-23 devnull i = indexsect(mainindex, u->score);
75 7a4ee46d 2003-11-23 devnull if(i < 0 || i >= nqs){
76 7a4ee46d 2003-11-23 devnull seterr(EBug, "internal error: illegal index section in queuewrite");
77 7a4ee46d 2003-11-23 devnull return -1;
78 7a4ee46d 2003-11-23 devnull }
79 7a4ee46d 2003-11-23 devnull
80 7a4ee46d 2003-11-23 devnull q = &lumpqs[i];
81 7a4ee46d 2003-11-23 devnull
82 7a4ee46d 2003-11-23 devnull qlock(&q->lock);
83 7a4ee46d 2003-11-23 devnull while(q->r == ((q->w + 1) & (MaxLumpQ - 1)))
84 7a4ee46d 2003-11-23 devnull rsleep(&q->full);
85 7a4ee46d 2003-11-23 devnull
86 7a4ee46d 2003-11-23 devnull q->q[q->w].u = u;
87 7a4ee46d 2003-11-23 devnull q->q[q->w].p = p;
88 7a4ee46d 2003-11-23 devnull q->q[q->w].creator = creator;
89 7a4ee46d 2003-11-23 devnull q->q[q->w].gen = gen;
90 7a4ee46d 2003-11-23 devnull q->w = (q->w + 1) & (MaxLumpQ - 1);
91 7a4ee46d 2003-11-23 devnull
92 7a4ee46d 2003-11-23 devnull rwakeup(&q->empty);
93 7a4ee46d 2003-11-23 devnull
94 7a4ee46d 2003-11-23 devnull qunlock(&q->lock);
95 7a4ee46d 2003-11-23 devnull
96 7a4ee46d 2003-11-23 devnull return 0;
97 7a4ee46d 2003-11-23 devnull }
98 7a4ee46d 2003-11-23 devnull
99 7a4ee46d 2003-11-23 devnull void
100 7a4ee46d 2003-11-23 devnull queueflush(void)
101 7a4ee46d 2003-11-23 devnull {
102 7a4ee46d 2003-11-23 devnull int i;
103 7a4ee46d 2003-11-23 devnull LumpQueue *q;
104 7a4ee46d 2003-11-23 devnull
105 7a4ee46d 2003-11-23 devnull qlock(&glk);
106 7a4ee46d 2003-11-23 devnull gen++;
107 7a4ee46d 2003-11-23 devnull qunlock(&glk);
108 7a4ee46d 2003-11-23 devnull
109 7a4ee46d 2003-11-23 devnull for(i=0; i<mainindex->nsects; i++){
110 7a4ee46d 2003-11-23 devnull q = &lumpqs[i];
111 7a4ee46d 2003-11-23 devnull qlock(&q->lock);
112 7a4ee46d 2003-11-23 devnull while(q->w != q->r && gen - q->q[q->r].gen > 0)
113 7a4ee46d 2003-11-23 devnull rsleep(&q->flush);
114 7a4ee46d 2003-11-23 devnull qunlock(&q->lock);
115 7a4ee46d 2003-11-23 devnull }
116 7a4ee46d 2003-11-23 devnull }
117 7a4ee46d 2003-11-23 devnull
118 7a4ee46d 2003-11-23 devnull static void
119 7a4ee46d 2003-11-23 devnull queueproc(void *vq)
120 7a4ee46d 2003-11-23 devnull {
121 7a4ee46d 2003-11-23 devnull LumpQueue *q;
122 7a4ee46d 2003-11-23 devnull Lump *u;
123 7a4ee46d 2003-11-23 devnull Packet *p;
124 7a4ee46d 2003-11-23 devnull int creator;
125 7a4ee46d 2003-11-23 devnull
126 7a4ee46d 2003-11-23 devnull q = vq;
127 7a4ee46d 2003-11-23 devnull for(;;){
128 7a4ee46d 2003-11-23 devnull qlock(&q->lock);
129 7a4ee46d 2003-11-23 devnull while(q->w == q->r)
130 7a4ee46d 2003-11-23 devnull rsleep(&q->empty);
131 7a4ee46d 2003-11-23 devnull
132 7a4ee46d 2003-11-23 devnull u = q->q[q->r].u;
133 7a4ee46d 2003-11-23 devnull p = q->q[q->r].p;
134 7a4ee46d 2003-11-23 devnull creator = q->q[q->r].creator;
135 7a4ee46d 2003-11-23 devnull
136 7a4ee46d 2003-11-23 devnull rwakeup(&q->full);
137 7a4ee46d 2003-11-23 devnull
138 7a4ee46d 2003-11-23 devnull qunlock(&q->lock);
139 7a4ee46d 2003-11-23 devnull
140 7a4ee46d 2003-11-23 devnull if(writeqlump(u, p, creator) < 0)
141 7a4ee46d 2003-11-23 devnull fprint(2, "failed to write lump for %V: %r", u->score);
142 7a4ee46d 2003-11-23 devnull
143 7a4ee46d 2003-11-23 devnull qlock(&q->lock);
144 7a4ee46d 2003-11-23 devnull q->r = (q->r + 1) & (MaxLumpQ - 1);
145 7a4ee46d 2003-11-23 devnull rwakeup(&q->flush);
146 7a4ee46d 2003-11-23 devnull qunlock(&q->lock);
147 7a4ee46d 2003-11-23 devnull
148 7a4ee46d 2003-11-23 devnull putlump(u);
149 7a4ee46d 2003-11-23 devnull }
150 7a4ee46d 2003-11-23 devnull }