blob: be4eb3f42d6fe1cfb6822e241fa9971865995ed7 [file] [log] [blame]
Ian Lance Taylord5ba6682008-11-06 22:27:32 -08001// $G $D/$F.go && $L $F.$A && ./$A.out
2
3// Copyright 2009 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7package main
8
9var counter uint
10var shift uint
11
Russ Cox839a6842009-01-20 14:40:40 -080012func GetValue() uint {
Rob Pike325cf8e2010-03-24 16:46:53 -070013 counter++
Rob Pike74dd0ab2009-08-17 13:30:22 -070014 return 1 << shift
Ian Lance Taylord5ba6682008-11-06 22:27:32 -080015}
16
Russ Cox839a6842009-01-20 14:40:40 -080017func Send(a, b chan uint) int {
Rob Pike325cf8e2010-03-24 16:46:53 -070018 var i int
Rob Pike74dd0ab2009-08-17 13:30:22 -070019
20LOOP:
21 for {
22 select {
23 case a <- GetValue():
Rob Pike325cf8e2010-03-24 16:46:53 -070024 i++
25 a = nil
Rob Pike74dd0ab2009-08-17 13:30:22 -070026 case b <- GetValue():
Rob Pike325cf8e2010-03-24 16:46:53 -070027 i++
28 b = nil
Rob Pike74dd0ab2009-08-17 13:30:22 -070029 default:
Rob Pike325cf8e2010-03-24 16:46:53 -070030 break LOOP
Rob Pike74dd0ab2009-08-17 13:30:22 -070031 }
Rob Pike325cf8e2010-03-24 16:46:53 -070032 shift++
Rob Pike74dd0ab2009-08-17 13:30:22 -070033 }
Rob Pike325cf8e2010-03-24 16:46:53 -070034 return i
Ian Lance Taylord5ba6682008-11-06 22:27:32 -080035}
36
37func main() {
Rob Pike325cf8e2010-03-24 16:46:53 -070038 a := make(chan uint, 1)
39 b := make(chan uint, 1)
Rob Pike74dd0ab2009-08-17 13:30:22 -070040 if v := Send(a, b); v != 2 {
Rob Pike325cf8e2010-03-24 16:46:53 -070041 println("Send returned", v, "!= 2")
42 panic("fail")
Rob Pike74dd0ab2009-08-17 13:30:22 -070043 }
Rob Pike325cf8e2010-03-24 16:46:53 -070044 if av, bv := <-a, <-b; av|bv != 3 {
45 println("bad values", av, bv)
46 panic("fail")
Rob Pike74dd0ab2009-08-17 13:30:22 -070047 }
48 if v := Send(a, nil); v != 1 {
Rob Pike325cf8e2010-03-24 16:46:53 -070049 println("Send returned", v, "!= 1")
50 panic("fail")
Rob Pike74dd0ab2009-08-17 13:30:22 -070051 }
52 if counter != 10 {
Rob Pike325cf8e2010-03-24 16:46:53 -070053 println("counter is", counter, "!= 10")
54 panic("fail")
Rob Pike74dd0ab2009-08-17 13:30:22 -070055 }
Ian Lance Taylord5ba6682008-11-06 22:27:32 -080056}