}
-static void selectdefault(Select**);
+static void selectdefault(Select*, void*);
// selectdefault(sel *byte) (selected bool);
#pragma textflag 7
void
runtime·selectdefault(Select *sel, ...)
{
- selectdefault(&sel);
+ selectdefault(sel, runtime·getcallerpc(&sel));
}
static void
-selectdefault(Select **selp)
+selectdefault(Select *sel, void *callerpc)
{
- Select *sel;
int32 i;
Scase *cas;
- sel = *selp;
i = sel->ncase;
if(i >= sel->tcase)
runtime·throw("selectdefault: too many cases");
sel->ncase = i+1;
cas = runtime·mal(sizeof *cas);
sel->scase[i] = cas;
- cas->pc = runtime·getcallerpc(selp);
+ cas->pc = callerpc;
cas->chan = nil;
cas->so = runtime·rnd(sizeof(sel), Structrnd);
runtime·gosched();
}
-static void selectgo(Select**);
+static void* selectgo(Select**);
// selectgo(sel *byte);
//
void
runtime·selectgo(Select *sel)
{
- selectgo(&sel);
+ runtime·setcallerpc(&sel, selectgo(&sel));
}
-static void
+static void*
selectgo(Select **selp)
{
Select *sel;
SudoG *sg;
G *gp;
byte *as;
+ void *pc;
sel = *selp;
if(runtime·gcwaiting)
selunlock(sel);
// return to pc corresponding to chosen case
- runtime·setcallerpc(selp, cas->pc);
+
+ pc = cas->pc;
as = (byte*)selp + cas->so;
freesel(sel);
*as = true;
- return;
+ return pc;
sclose:
// send on closed channel
selunlock(sel);
runtime·panicstring("send on closed channel");
+ return nil; // not reached
}
// closechan(sel *byte);