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 communication with multiple simultaneous goroutines.
8
9package main
10
11import "runtime"
12
13const N = 1000 // sent messages
14const M = 10   // receiving goroutines
15const W = 2    // channel buffering
16var h [N]int   // marking of send/recv
17
18func r(c chan int, m int) {
19	for {
20		select {
21		case r := <-c:
22			if h[r] != 1 {
23				println("r",
24					"m=", m,
25					"r=", r,
26					"h=", h[r])
27				panic("fail")
28			}
29			h[r] = 2
30		}
31	}
32}
33
34func s(c chan int) {
35	for n := 0; n < N; n++ {
36		r := n
37		if h[r] != 0 {
38			println("s")
39			panic("fail")
40		}
41		h[r] = 1
42		c <- r
43	}
44}
45
46func main() {
47	c := make(chan int, W)
48	for m := 0; m < M; m++ {
49		go r(c, m)
50		runtime.Gosched()
51	}
52	runtime.Gosched()
53	runtime.Gosched()
54	s(c)
55}
56