modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/chan/fifo.go (about)

     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  
     9  package main
    10  
    11  import "os"
    12  
    13  const N = 10
    14  
    15  func 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  
    28  func 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
    37  func 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  
    53  func main() {
    54  	AsynchFifo()
    55  	SynchFifo()
    56  }