1
0
mirror of https://github.com/golang/go synced 2024-11-11 21:20:21 -07:00

use real select

R=ken
OCL=13519
CL=13519
This commit is contained in:
Rob Pike 2008-07-28 12:03:56 -07:00
parent 3835e01d97
commit 9c8f48bd0e

View File

@ -75,49 +75,22 @@ func mkdch2() *dch2 {
// generation to begin servicing out[1].
func dosplit(in *dch, out *dch2, wait *chan int ){
//print "dosplit ", wait, "\n";
var t *dch;
both := false; // do not service both channels
/*
select {
case <-out[0].req:
;
case <-wait:
both = 1;
both = true;
select {
case <-out[0].req:
;
case <-out[1].req:
t=out[0]; out[0]=out[1]; out[1]=t;
};
}
*/
// select simulation
for {
var ok bool;
var dummy int;
dummy, ok = <-out[0].req;
if ok { goto OUT1 }
dummy, ok = <-wait;
if ok {
both = true;
// select simulation
for {
dummy, ok = <-out[0].req;
if ok { goto OUT1 }
dummy, ok = <-out[1].req;
if ok {
out[0], out[1] = out[1], out[0];
goto OUT1
}
sys.gosched();
}
}
sys.gosched();
}
OUT1: //BUG
seqno++;
in.req -< seqno;
release := new(chan int);
@ -165,42 +138,21 @@ func getn(in *[]*dch, n int) *[]item {
}
for n=2*n; n>0; n-- {
seqno++
/*
select{
case req[i=] <-= seqno:
dat[i] = in[i].dat;
req[i] = nil;
case it = <-dat[i=]:
out[i] = it;
dat[i] = nil;
}
*/
// simulation of select
sel:
for c1:=0; ; c1++ {
for i := 0; i < 2; i++ {
ok := false;
if req[i] != nil { ok = req[i] -< seqno }
if ok {
dat[i] = in[i].dat;
req[i] = nil;
goto OUT; // BUG
break sel;
}
ok = false;
if dat[i] != nil { it, ok = <-dat[i] }
if ok {
out[i] = it;
dat[i] = nil;
goto OUT; // BUG
break sel;
}
sys.gosched();
}
sys.gosched();
select{
case req[0] -< seqno:
dat[0] = in[0].dat;
req[0] = nil;
case req[1] -< seqno:
dat[1] = in[1].dat;
req[1] = nil;
case it <- dat[0]:
out[0] = it;
dat[0] = nil;
case it <- dat[1]:
out[1] = it;
dat[1] = nil;
}
OUT:
}
return out;
}
@ -251,7 +203,6 @@ func mkPS2() *dch2 {
func gcd (u, v int64) int64{
if u < 0 { return gcd(-u, v) }
if u > v { return gcd(v, u) }
if u == 0 { return v }
return gcd(v%u, u)
}