]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: select bug
authorRuss Cox <rsc@golang.org>
Fri, 28 Jan 2011 22:17:38 +0000 (17:17 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 28 Jan 2011 22:17:38 +0000 (17:17 -0500)
The sanity checking in pass 2 is wrong
when a select is offering to communicate in
either direction on a channel and neither case
is immediately ready.

R=ken2
CC=golang-dev
https://golang.org/cl/3991047

src/pkg/runtime/chan.c
test/chan/select3.go

index 1cc589278d9ce706f4845ffec893839cbfe2d8c3..6f9f16826c8563c80d06182f84c42b4df82febca 100644 (file)
@@ -732,25 +732,12 @@ loop:
 
                switch(cas->send) {
                case 0: // recv
-                       if(c->dataqsiz > 0) {
-                               if(c->qcount > 0)
-                                       runtime·throw("select: pass 2 async recv");
-                       } else {
-                               if(dequeue(&c->sendq, c))
-                                       runtime·throw("select: pass 2 sync recv");
-                       }
                        enqueue(&c->recvq, sg);
                        break;
                
                case 1: // send
-                       if(c->dataqsiz > 0) {
-                               if(c->qcount < c->dataqsiz)
-                                       runtime·throw("select: pass 2 async send");
-                       } else {
-                               if(dequeue(&c->recvq, c))
-                                       runtime·throw("select: pass 2 sync send");
+                       if(c->dataqsiz == 0)
                                c->elemalg->copy(c->elemsize, sg->elem, cas->u.elem);
-                       }
                        enqueue(&c->sendq, sg);
                        break;
                }
index 9877b12a98ce04e1f481453d0809f356fa8afae4..47941063c0f82ad0fc8dab61f5620bce8e42420b 100644 (file)
@@ -196,4 +196,13 @@ func main() {
                case closedch <- 7:
                }
        })
+       
+       // select should not get confused if it sees itself
+       testBlock(always, func() {
+               c := make(chan int)
+               select {
+               case c <- 1:
+               case <-c:
+               }
+       })
 }