mirror of
https://github.com/golang/go
synced 2024-11-12 09:20:22 -07:00
runtime support for default in select.
assumes cas->send == 2 for default case. R=ken OCL=18628 CL=18628
This commit is contained in:
parent
d6a7cefd1e
commit
b69e80d8dd
@ -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
|
|||||||
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)
|
|||||||
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) {
|
||||||
@ -569,6 +574,12 @@ sys·selectgo(Select *sel)
|
|||||||
if(o >= sel->ncase)
|
if(o >= sel->ncase)
|
||||||
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++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user