5 typedef struct LumpQueue LumpQueue;
6 typedef struct WLump WLump;
10 MaxLumpQ = 1 << 3 /* max. lumps on a single write queue, must be pow 2 */
33 static LumpQueue *lumpqs;
39 static void queueproc(void *vq);
42 initlumpqueues(int nq)
49 lumpqs = MKNZ(LumpQueue, nq);
51 for(i = 0; i < nq; i++){
54 q->empty.l = &q->lock;
55 q->flush.l = &q->lock;
57 if(vtproc(queueproc, q) < 0){
58 seterr(EOk, "can't start write queue slave: %r");
67 * queue a lump & it's packet data for writing
70 queuewrite(Lump *u, Packet *p, int creator, uint ms)
75 trace(TraceProc, "queuewrite");
76 i = indexsect(mainindex, u->score);
77 if(i < 0 || i >= nqs){
78 seterr(EBug, "internal error: illegal index section in queuewrite");
85 while(q->r == ((q->w + 1) & (MaxLumpQ - 1))){
86 trace(TraceProc, "queuewrite sleep");
92 q->q[q->w].creator = creator;
95 q->w = (q->w + 1) & (MaxLumpQ - 1);
97 trace(TraceProc, "queuewrite wakeup");
114 trace(TraceProc, "flushqueue");
120 for(i=0; i<mainindex->nsects; i++){
123 while(q->w != q->r && gen - q->q[q->r].gen > 0){
124 trace(TraceProc, "flushqueue sleep q%d", i);
140 threadsetname("queueproc");
146 trace(TraceProc, "queueproc sleep empty");
152 creator = q->q[q->r].creator;
155 q->r = (q->r + 1) & (MaxLumpQ - 1);
156 trace(TraceProc, "queueproc wakeup flush");
157 rwakeupall(&q->flush);
159 trace(TraceProc, "queueproc wakeup full");
164 trace(TraceProc, "queueproc writelump %V", u->score);
165 if(writeqlump(u, p, creator, ms) < 0)
166 fprint(2, "failed to write lump for %V: %r", u->score);
167 trace(TraceProc, "queueproc wrotelump %V", u->score);