use real select
R=ken
OCL=13519
CL=13519
diff --git a/test/chan/powser1.go b/test/chan/powser1.go
index 65ea0db..9a5498a 100644
--- a/test/chan/powser1.go
+++ b/test/chan/powser1.go
@@ -75,49 +75,22 @@
// 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 @@
}
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 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)
}