Commit b69e80d8 authored by Russ Cox's avatar Russ Cox

runtime support for default in select.

assumes cas->send == 2 for default case.

R=ken
OCL=18628
CL=18628
parent d6a7cefd
...@@ -52,7 +52,7 @@ struct Scase ...@@ -52,7 +52,7 @@ struct Scase
{ {
Hchan* chan; // chan Hchan* chan; // chan
byte* pc; // return pc byte* pc; // return pc
uint16 send; // 0-recv 1-send uint16 send; // 0-recv 1-send 2-default
uint16 so; // vararg of selected bool uint16 so; // vararg of selected bool
union { union {
byte elem[8]; // element (send) byte elem[8]; // element (send)
...@@ -504,7 +504,7 @@ void ...@@ -504,7 +504,7 @@ void
sys·selectgo(Select *sel) sys·selectgo(Select *sel)
{ {
uint32 p, o, i; uint32 p, o, i;
Scase *cas; Scase *cas, *dfl;
Hchan *c; Hchan *c;
SudoG *sg; SudoG *sg;
G *gp; G *gp;
...@@ -542,8 +542,13 @@ sys·selectgo(Select *sel) ...@@ -542,8 +542,13 @@ sys·selectgo(Select *sel)
lock(&chanlock); lock(&chanlock);
// pass 1 - look for something already waiting // pass 1 - look for something already waiting
dfl = nil;
for(i=0; i<sel->ncase; i++) { for(i=0; i<sel->ncase; i++) {
cas = &sel->scase[o]; cas = &sel->scase[o];
if(cas->send == 2) { // default
dfl = cas;
continue;
}
c = cas->chan; c = cas->chan;
if(c->dataqsiz > 0) { if(c->dataqsiz > 0) {
if(cas->send) { if(cas->send) {
...@@ -570,6 +575,12 @@ sys·selectgo(Select *sel) ...@@ -570,6 +575,12 @@ sys·selectgo(Select *sel)
o -= sel->ncase; o -= sel->ncase;
} }
if(dfl != nil) {
cas = dfl;
goto retc;
}
// pass 2 - enqueue on all chans // pass 2 - enqueue on all chans
for(i=0; i<sel->ncase; i++) { for(i=0; i<sel->ncase; i++) {
cas = &sel->scase[o]; cas = &sel->scase[o];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment