diff options
| author | Russ Cox <rsc@golang.org> | 2008-11-05 17:57:18 -0800 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2008-11-05 17:57:18 -0800 |
| commit | b69e80d8dd683600c70a334da52fc0cd8a56e739 (patch) | |
| tree | 2c1c48d0be9a4d239a746073d99fd701ffe46420 /src/runtime | |
| parent | d6a7cefd1e63dcd9ae8590c36aa0574596075ab9 (diff) | |
| download | go-b69e80d8dd683600c70a334da52fc0cd8a56e739.tar.xz | |
runtime support for default in select.
assumes cas->send == 2 for default case.
R=ken
OCL=18628
CL=18628
Diffstat (limited to 'src/runtime')
| -rw-r--r-- | src/runtime/chan.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/runtime/chan.c b/src/runtime/chan.c index e9e3b3374f..6cabe634d4 100644 --- a/src/runtime/chan.c +++ b/src/runtime/chan.c @@ -52,7 +52,7 @@ struct Scase { Hchan* chan; // chan byte* pc; // return pc - uint16 send; // 0-recv 1-send + uint16 send; // 0-recv 1-send 2-default uint16 so; // vararg of selected bool union { byte elem[8]; // element (send) @@ -504,7 +504,7 @@ void sys·selectgo(Select *sel) { uint32 p, o, i; - Scase *cas; + Scase *cas, *dfl; Hchan *c; SudoG *sg; G *gp; @@ -542,8 +542,13 @@ sys·selectgo(Select *sel) lock(&chanlock); // pass 1 - look for something already waiting + dfl = nil; for(i=0; i<sel->ncase; i++) { cas = &sel->scase[o]; + if(cas->send == 2) { // default + dfl = cas; + continue; + } c = cas->chan; if(c->dataqsiz > 0) { if(cas->send) { @@ -569,6 +574,12 @@ sys·selectgo(Select *sel) if(o >= sel->ncase) o -= sel->ncase; } + + if(dfl != nil) { + cas = dfl; + goto retc; + } + // pass 2 - enqueue on all chans for(i=0; i<sel->ncase; i++) { |
