blob: 70d20b31f098ee0f5f629c10fbd7ac93b9e2afad [file] [log] [blame]
Russ Cox0b477ef2012-02-16 23:48:57 -05001// run
Rob Pikea703c9a2008-07-15 19:19:50 -07002
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
Rob Pike3fb5f322012-02-19 17:44:02 +11007// Test that unbuffered channels act as pure fifos.
Rob Pikea703c9a2008-07-15 19:19:50 -07008
9package main
10
Russ Cox918afd942009-05-08 15:21:41 -070011import "os"
12
Russ Cox839a6842009-01-20 14:40:40 -080013const N = 10
Rob Pikea703c9a2008-07-15 19:19:50 -070014
Russ Cox839a6842009-01-20 14:40:40 -080015func AsynchFifo() {
Rob Pike4f61fc92010-09-04 10:36:13 +100016 ch := make(chan int, N)
Rob Pikea703c9a2008-07-15 19:19:50 -070017 for i := 0; i < N; i++ {
Rob Pike27c0eb82008-09-16 19:33:40 -070018 ch <- i
Rob Pikea703c9a2008-07-15 19:19:50 -070019 }
20 for i := 0; i < N; i++ {
Rob Pike33101922008-07-15 20:52:07 -070021 if <-ch != i {
Rob Pike4f61fc92010-09-04 10:36:13 +100022 print("bad receive\n")
23 os.Exit(1)
Rob Pikea703c9a2008-07-15 19:19:50 -070024 }
25 }
26}
27
Russ Cox839a6842009-01-20 14:40:40 -080028func Chain(ch <-chan int, val int, in <-chan int, out chan<- int) {
Rob Pike4f61fc92010-09-04 10:36:13 +100029 <-in
Rob Pike33101922008-07-15 20:52:07 -070030 if <-ch != val {
Rob Pikebc2f5f12008-08-11 22:07:49 -070031 panic(val)
Rob Pikea703c9a2008-07-15 19:19:50 -070032 }
Rob Pike27c0eb82008-09-16 19:33:40 -070033 out <- 1
Rob Pikea703c9a2008-07-15 19:19:50 -070034}
35
36// thread together a daisy chain to read the elements in sequence
Russ Cox839a6842009-01-20 14:40:40 -080037func SynchFifo() {
Rob Pike4f61fc92010-09-04 10:36:13 +100038 ch := make(chan int)
39 in := make(chan int)
40 start := in
Rob Pikea703c9a2008-07-15 19:19:50 -070041 for i := 0; i < N; i++ {
Rob Pike4f61fc92010-09-04 10:36:13 +100042 out := make(chan int)
43 go Chain(ch, i, in, out)
44 in = out
Rob Pikea703c9a2008-07-15 19:19:50 -070045 }
Rob Pike4f61fc92010-09-04 10:36:13 +100046 start <- 0
Rob Pikea703c9a2008-07-15 19:19:50 -070047 for i := 0; i < N; i++ {
Rob Pike27c0eb82008-09-16 19:33:40 -070048 ch <- i
Rob Pikea703c9a2008-07-15 19:19:50 -070049 }
Rob Pikef4392992008-08-04 16:29:22 -070050 <-in
Rob Pikea703c9a2008-07-15 19:19:50 -070051}
52
53func main() {
Rob Pike4f61fc92010-09-04 10:36:13 +100054 AsynchFifo()
55 SynchFifo()
Rob Pikea703c9a2008-07-15 19:19:50 -070056}
57