// $G $D/$F.go && $L $F.$A && ./$A.out | |
// Copyright 2009 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. | |
// Verify that unbuffered channels act as pure fifos. | |
package main | |
const N = 10 | |
func AsynchFifo() { | |
ch := new(chan int, N); | |
for i := 0; i < N; i++ { | |
>ch = i | |
} | |
for i := 0; i < N; i++ { | |
if <ch != i { | |
print "bad receive\n"; | |
sys.exit(1); | |
} | |
} | |
} | |
func Chain(ch *chan< int, val int, in *chan< int, out *chan> int) { | |
BUG := <in; | |
if <ch != val { | |
panic val; | |
} | |
>out = 1; | |
} | |
// thread together a daisy chain to read the elements in sequence | |
func SynchFifo() { | |
ch := new(chan int); | |
in := new(chan int); | |
start := in; | |
for i := 0; i < N; i++ { | |
out := new(chan int); | |
go Chain(ch, i, in, out); | |
in = out; | |
} | |
>start = 0; | |
for i := 0; i < N; i++ { | |
>ch = i | |
} | |
} | |
func main() { | |
AsynchFifo(); | |
SynchFifo(); | |
} | |