#include "type.h"
#define MAXALIGN 7
+#define NOSELGEN 1
static int32 debug = 0;
static void enqueue(WaitQ*, SudoG*);
static SudoG* allocsg(Hchan*);
static void freesg(Hchan*, SudoG*);
-static uint32 fastrandn(uint32);
static void destroychan(Hchan*);
Hchan*
mysg.elem = ep;
mysg.g = g;
- mysg.selgen = g->selgen;
+ mysg.selgen = NOSELGEN;
g->param = nil;
g->status = Gwaiting;
enqueue(&c->sendq, &mysg);
}
mysg.g = g;
mysg.elem = nil;
- mysg.selgen = g->selgen;
+ mysg.selgen = NOSELGEN;
g->status = Gwaiting;
enqueue(&c->sendq, &mysg);
runtime·unlock(c);
mysg.elem = ep;
mysg.g = g;
- mysg.selgen = g->selgen;
+ mysg.selgen = NOSELGEN;
g->param = nil;
g->status = Gwaiting;
enqueue(&c->recvq, &mysg);
}
mysg.g = g;
mysg.elem = nil;
- mysg.selgen = g->selgen;
+ mysg.selgen = NOSELGEN;
g->status = Gwaiting;
enqueue(&c->recvq, &mysg);
runtime·unlock(c);
sel->order[i] = i;
for(i=1; i<sel->ncase; i++) {
o = sel->order[i];
- j = fastrandn(i+1);
+ j = runtime·fastrand1()%(i+1);
sel->order[i] = sel->order[j];
sel->order[j] = o;
}
q->first = sgp->link;
// if sgp is stale, ignore it
- if(!runtime·cas(&sgp->g->selgen, sgp->selgen, sgp->selgen + 1)) {
+ if(sgp->selgen != NOSELGEN &&
+ (sgp->selgen != sgp->g->selgen ||
+ !runtime·cas(&sgp->g->selgen, sgp->selgen, sgp->selgen + 2))) {
//prints("INVALID PSEUDOG POINTER\n");
freesg(c, sgp);
goto loop;
c->free = sg;
}
}
-
-static uint32
-fastrandn(uint32 n)
-{
- uint32 max, r;
-
- if(n <= 1)
- return 0;
-
- r = runtime·fastrand1();
- if(r < (1ULL<<31)-n) // avoid computing max in common case
- return r%n;
-
- max = (1ULL<<31)/n * n;
- while(r >= max)
- r = runtime·fastrand1();
- return r%n;
-}