Russ Cox | 0b477ef | 2012-02-16 23:48:57 -0500 | [diff] [blame] | 1 | // run |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 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 | |
Rob Pike | 3fb5f32 | 2012-02-19 17:44:02 +1100 | [diff] [blame] | 7 | // Test that unbuffered channels act as pure fifos. |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 8 | |
| 9 | package main |
| 10 | |
Russ Cox | 918afd94 | 2009-05-08 15:21:41 -0700 | [diff] [blame] | 11 | import "os" |
| 12 | |
Russ Cox | 839a684 | 2009-01-20 14:40:40 -0800 | [diff] [blame] | 13 | const N = 10 |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 14 | |
Russ Cox | 839a684 | 2009-01-20 14:40:40 -0800 | [diff] [blame] | 15 | func AsynchFifo() { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 16 | ch := make(chan int, N) |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 17 | for i := 0; i < N; i++ { |
Rob Pike | 27c0eb8 | 2008-09-16 19:33:40 -0700 | [diff] [blame] | 18 | ch <- i |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 19 | } |
| 20 | for i := 0; i < N; i++ { |
Rob Pike | 3310192 | 2008-07-15 20:52:07 -0700 | [diff] [blame] | 21 | if <-ch != i { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 22 | print("bad receive\n") |
| 23 | os.Exit(1) |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 24 | } |
| 25 | } |
| 26 | } |
| 27 | |
Russ Cox | 839a684 | 2009-01-20 14:40:40 -0800 | [diff] [blame] | 28 | func Chain(ch <-chan int, val int, in <-chan int, out chan<- int) { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 29 | <-in |
Rob Pike | 3310192 | 2008-07-15 20:52:07 -0700 | [diff] [blame] | 30 | if <-ch != val { |
Rob Pike | bc2f5f1 | 2008-08-11 22:07:49 -0700 | [diff] [blame] | 31 | panic(val) |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 32 | } |
Rob Pike | 27c0eb8 | 2008-09-16 19:33:40 -0700 | [diff] [blame] | 33 | out <- 1 |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 34 | } |
| 35 | |
| 36 | // thread together a daisy chain to read the elements in sequence |
Russ Cox | 839a684 | 2009-01-20 14:40:40 -0800 | [diff] [blame] | 37 | func SynchFifo() { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 38 | ch := make(chan int) |
| 39 | in := make(chan int) |
| 40 | start := in |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 41 | for i := 0; i < N; i++ { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 42 | out := make(chan int) |
| 43 | go Chain(ch, i, in, out) |
| 44 | in = out |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 45 | } |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 46 | start <- 0 |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 47 | for i := 0; i < N; i++ { |
Rob Pike | 27c0eb8 | 2008-09-16 19:33:40 -0700 | [diff] [blame] | 48 | ch <- i |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 49 | } |
Rob Pike | f439299 | 2008-08-04 16:29:22 -0700 | [diff] [blame] | 50 | <-in |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 51 | } |
| 52 | |
| 53 | func main() { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 54 | AsynchFifo() |
| 55 | SynchFifo() |
Rob Pike | a703c9a | 2008-07-15 19:19:50 -0700 | [diff] [blame] | 56 | } |
| 57 | |