1// run
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
7// Test that unbuffered channels act as pure fifos.
8
9package main
10
11import "os"
12
13const N = 10
14
15func AsynchFifo() {
16	ch := make(chan int, N)
17	for i := 0; i < N; i++ {
18		ch <- i
19	}
20	for i := 0; i < N; i++ {
21		if <-ch != i {
22			print("bad receive\n")
23			os.Exit(1)
24		}
25	}
26}
27
28func Chain(ch <-chan int, val int, in <-chan int, out chan<- int) {
29	<-in
30	if <-ch != val {
31		panic(val)
32	}
33	out <- 1
34}
35
36// thread together a daisy chain to read the elements in sequence
37func SynchFifo() {
38	ch := make(chan int)
39	in := make(chan int)
40	start := in
41	for i := 0; i < N; i++ {
42		out := make(chan int)
43		go Chain(ch, i, in, out)
44		in = out
45	}
46	start <- 0
47	for i := 0; i < N; i++ {
48		ch <- i
49	}
50	<-in
51}
52
53func main() {
54	AsynchFifo()
55	SynchFifo()
56}
57
58