From b69e80d8dd683600c70a334da52fc0cd8a56e739 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 5 Nov 2008 17:57:18 -0800 Subject: [PATCH] runtime support for default in select. assumes cas->send == 2 for default case. R=ken OCL=18628 CL=18628 --- src/runtime/chan.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/runtime/chan.c b/src/runtime/chan.c index e9e3b3374fa..6cabe634d46 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; incase; 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; incase; i++) {