if(debug) {
prints("newselect s=");
sys·printpointer(sel);
+ prints("newselect size=");
+ sys·printint(size);
prints("\n");
}
}
sys·printpointer(sel);
prints(" pc=");
sys·printpointer(cas->pc);
- prints(" chan=");
- sys·printpointer(cas->chan);
prints(" so=");
sys·printint(cas->so);
prints(" send=");
Hchan *c;
SudoG *sg;
G *gp;
-
byte *as;
if(xxx) {
dfl = nil;
for(i=0; i<sel->ncase; i++) {
cas = &sel->scase[o];
+
if(cas->send == 2) { // default
dfl = cas;
- continue;
+ goto next1;
}
+
c = cas->chan;
if(c->dataqsiz > 0) {
if(cas->send) {
if(c->qcount < c->dataqsiz)
goto asyns;
- } else {
- if(c->qcount > 0)
- goto asynr;
+ goto next1;
}
- } else
+ if(c->qcount > 0)
+ goto asynr;
+ goto next1;
+ }
if(cas->send) {
sg = dequeue(&c->recvq, c);
if(sg != nil)
goto gots;
- } else {
- sg = dequeue(&c->sendq, c);
- if(sg != nil)
- goto gotr;
+ goto next1;
}
+ sg = dequeue(&c->sendq, c);
+ if(sg != nil)
+ goto gotr;
+ next1:
o += p;
if(o >= sel->ncase)
o -= sel->ncase;
sg = allocsg(c);
sg->offset = o;
enqueue(&c->sendq, sg);
- } else {
- if(c->qcount > 0) {
- prints("selectgo: pass 2 async recv\n");
- goto asynr;
- }
- sg = allocsg(c);
- sg->offset = o;
- enqueue(&c->recvq, sg);
+ goto next2;
+ }
+ if(c->qcount > 0) {
+ prints("selectgo: pass 2 async recv\n");
+ goto asynr;
}
- } else
+ sg = allocsg(c);
+ sg->offset = o;
+ enqueue(&c->recvq, sg);
+ goto next2;
+ }
if(cas->send) {
sg = dequeue(&c->recvq, c);
sg->offset = o;
c->elemalg->copy(c->elemsize, sg->elem, cas->u.elem);
enqueue(&c->sendq, sg);
- } else {
- sg = dequeue(&c->sendq, c);
- if(sg != nil) {
- prints("selectgo: pass 2 sync recv\n");
- g->selgen++;
- goto gotr;
- }
- sg = allocsg(c);
- sg->offset = o;
- enqueue(&c->recvq, sg);
+ goto next2;
}
+ sg = dequeue(&c->sendq, c);
+ if(sg != nil) {
+ prints("selectgo: pass 2 sync recv\n");
+ g->selgen++;
+ goto gotr;
+ }
+ sg = allocsg(c);
+ sg->offset = o;
+ enqueue(&c->recvq, sg);
+ next2:
o += p;
if(o >= sel->ncase)
o -= sel->ncase;