aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2008-11-05 18:04:24 -0800
committerRuss Cox <rsc@golang.org>2008-11-05 18:04:24 -0800
commita6af48432819fcc6c963d1ac883aefe8cd6f7555 (patch)
treee1c33ef4fcfd7bf781002c3942b270e8041e0c84 /src
parentb69e80d8dd683600c70a334da52fc0cd8a56e739 (diff)
downloadgo-a6af48432819fcc6c963d1ac883aefe8cd6f7555.tar.xz
more runtime support for chan select default
R=ken OCL=18630 CL=18630
Diffstat (limited to 'src')
-rw-r--r--src/runtime/chan.c40
1 files changed, 39 insertions, 1 deletions
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);