From: Russ Cox Date: Thu, 6 Nov 2008 02:04:24 +0000 (-0800) Subject: more runtime support for chan select default X-Git-Tag: weekly.2009-11-06~2782 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a6af48432819fcc6c963d1ac883aefe8cd6f7555;p=gostls13.git more runtime support for chan select default R=ken OCL=18630 CL=18630 --- diff --git a/src/runtime/chan.c b/src/runtime/chan.c index 6cabe634d4..3777190e29 100644 --- a/src/runtime/chan.c +++ b/src/runtime/chan.c @@ -469,7 +469,7 @@ sys·selectrecv(Select *sel, Hchan *c, ...) i = sel->ncase; if(i >= sel->tcase) - throw("selectsend: too many cases"); + throw("selectrecv: too many cases"); sel->ncase = i+1; cas = &sel->scase[i]; @@ -497,6 +497,44 @@ sys·selectrecv(Select *sel, Hchan *c, ...) } } +void +sys·selectdefault(Select *sel) +{ + int32 i, eo; + Scase *cas; + Hchan *c; + + c = nil; + i = sel->ncase; + if(i >= sel->tcase) + throw("selectdefault: too many cases"); + sel->ncase = i+1; + cas = &sel->scase[i]; + + cas->pc = sys·getcallerpc(&sel); + cas->chan = c; + + eo = rnd(sizeof(sel), sizeof(c)); + eo = rnd(eo+sizeof(c), sizeof(byte*)); + cas->so = rnd(eo+sizeof(byte*), 1); + cas->send = 2; + cas->u.elemp = *(byte**)((byte*)&sel + eo); + + if(debug) { + prints("newselect s="); + sys·printpointer(sel); + prints(" pc="); + sys·printpointer(cas->pc); + prints(" chan="); + sys·printpointer(cas->chan); + prints(" so="); + sys·printint(cas->so); + prints(" send="); + sys·printint(cas->send); + prints("\n"); + } +} + uint32 xxx = 0; // selectgo(sel *byte);