]> Cypherpunks repositories - gostls13.git/commitdiff
more runtime support for chan select default
authorRuss Cox <rsc@golang.org>
Thu, 6 Nov 2008 02:04:24 +0000 (18:04 -0800)
committerRuss Cox <rsc@golang.org>
Thu, 6 Nov 2008 02:04:24 +0000 (18:04 -0800)
R=ken
OCL=18630
CL=18630

src/runtime/chan.c

index 6cabe634d46f49ae1ac04d72ab129a5578960063..3777190e29b48f09237cfd5f3bc85122ba26950a 100644 (file)
@@ -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);