From a6af48432819fcc6c963d1ac883aefe8cd6f7555 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 5 Nov 2008 18:04:24 -0800 Subject: [PATCH] more runtime support for chan select default R=ken OCL=18630 CL=18630 --- src/runtime/chan.c | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) 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); -- 2.50.0