Blame


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