summaryrefslogtreecommitdiff
path: root/test/chan/select6.go
diff options
context:
space:
mode:
authorHector Chu <hectorchu@gmail.com>2011-07-18 16:15:01 -0400
committerHector Chu <hectorchu@gmail.com>2011-07-18 16:15:01 -0400
commit23fa4189d0e8c85061e2c36ab823b26ca6daefc5 (patch)
treef507a9e5534d1d52f42f667587795fefc6e40466 /test/chan/select6.go
parentc659b776221f3b4082ca2d202497e36adeb2f359 (diff)
downloadgo-23fa4189d0e8c85061e2c36ab823b26ca6daefc5.tar.gz
runtime: fix select pass 3
Fixes issue 2075 R=rsc, ken, r CC=golang-dev http://codereview.appspot.com/4748045 Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'test/chan/select6.go')
-rw-r--r--test/chan/select6.go34
1 files changed, 34 insertions, 0 deletions
diff --git a/test/chan/select6.go b/test/chan/select6.go
new file mode 100644
index 000000000..2ba6810ac
--- /dev/null
+++ b/test/chan/select6.go
@@ -0,0 +1,34 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 2075
+// A bug in select corrupts channel queues of failed cases
+// if there are multiple waiters on those channels and the
+// select is the last in the queue. If further waits are made
+// on the channel without draining it first then those waiters
+// will never wake up. In the code below c1 is such a channel.
+
+package main
+
+func main() {
+ c1 := make(chan bool)
+ c2 := make(chan bool)
+ c3 := make(chan bool)
+ go func() { <-c1 }()
+ go func() {
+ select {
+ case <-c1:
+ panic("dummy")
+ case <-c2:
+ c3 <- true
+ }
+ <-c1
+ }()
+ go func() { c2 <- true }()
+ <-c3
+ c1 <- true
+ c1 <- true
+}