12 kickwqr(Buq *q, Req *r)
17 for(bb = &q->bh; q->nwq > 0; bb = &b->next){
20 if(b->wreq == nil || (b->wreq != r && r != nil))
23 b = realloc(b, sizeof(*b) + l);
27 memmove(b->end, b->rp, l);
30 b->wreq->ofcall.count = b->wreq->ifcall.count;
31 respond(b->wreq, q->error);
45 if((b = q->bh) == nil){
47 if((q->rh = r->aux) == nil)
49 if(r->ifcall.type == Tread)
56 if((q->rh = r->aux) == nil)
58 if(r->ifcall.type == Topen){
63 if(l > r->ifcall.count)
65 memmove(r->ofcall.data, b->rp, l);
71 if((q->bh = b->next) == nil)
74 r->ofcall.count = r->ifcall.count;
81 if(q->closed && q->nwq > 0)
87 buread(Buq *q, void *v, int l)
93 while((b = q->bh) == nil){
97 werrstr("%s", q->error);
105 if(l > (b->ep - b->rp))
107 memmove(v, b->rp, l);
115 if((q->bh = b->next) == nil)
119 r->ofcall.count = r->ifcall.count;
127 buwrite(Buq *q, void *v, int l)
131 b = emalloc(sizeof(*b) + l);
135 memmove(b->rp, v, l);
141 werrstr("%s", q->error);
152 while(!q->closed && q->size >= q->limit)
159 buclose(Buq *q, char *error)
166 q->error = estrdup9p(error);
178 q = emalloc(sizeof(*q));
193 if(q == nil || decref(q))
209 bureq(Buq *q, Req *r)
214 switch(r->ifcall.type){
216 respond(r, "bug in bureq");
220 if(!q->closed && (q->size + l) < q->limit){
221 r->ofcall.count = buwrite(q, r->ifcall.data, r->ifcall.count);
225 b = emalloc(sizeof(*b));
227 b->rp = (uchar*)r->ifcall.data;
241 q->rt = (Req**)&r->aux;
249 buflushreq(Buq *q, Req *r)
253 switch(r->ifcall.type){
255 respond(r, "bug in bufflushreq");
264 for(rr = &q->rh; *rr; rr = (Req**)&((*rr)->aux)){
267 if((*rr = r->aux) == nil)
269 respond(r, "interrupted");