Source file
test/chan/nonblock.go
1
2
3
4
5
6
7
8
9
10 package main
11
12 import "runtime"
13 import "time"
14
15 func i32receiver(c chan int32, strobe chan bool) {
16 if <-c != 123 {
17 panic("i32 value")
18 }
19 strobe <- true
20 }
21
22 func i32sender(c chan int32, strobe chan bool) {
23 c <- 234
24 strobe <- true
25 }
26
27 func i64receiver(c chan int64, strobe chan bool) {
28 if <-c != 123456 {
29 panic("i64 value")
30 }
31 strobe <- true
32 }
33
34 func i64sender(c chan int64, strobe chan bool) {
35 c <- 234567
36 strobe <- true
37 }
38
39 func breceiver(c chan bool, strobe chan bool) {
40 if !<-c {
41 panic("b value")
42 }
43 strobe <- true
44 }
45
46 func bsender(c chan bool, strobe chan bool) {
47 c <- true
48 strobe <- true
49 }
50
51 func sreceiver(c chan string, strobe chan bool) {
52 if <-c != "hello" {
53 panic("s value")
54 }
55 strobe <- true
56 }
57
58 func ssender(c chan string, strobe chan bool) {
59 c <- "hello again"
60 strobe <- true
61 }
62
63 var ticker = time.Tick(10 * 1000)
64 func sleep() {
65 <-ticker
66 <-ticker
67 runtime.Gosched()
68 runtime.Gosched()
69 runtime.Gosched()
70 }
71
72 const maxTries = 10000
73
74 func main() {
75 var i32 int32
76 var i64 int64
77 var b bool
78 var s string
79
80 var sync = make(chan bool)
81
82 for buffer := 0; buffer < 2; buffer++ {
83 c32 := make(chan int32, buffer)
84 c64 := make(chan int64, buffer)
85 cb := make(chan bool, buffer)
86 cs := make(chan string, buffer)
87
88 select {
89 case i32 = <-c32:
90 panic("blocked i32sender")
91 default:
92 }
93
94 select {
95 case i64 = <-c64:
96 panic("blocked i64sender")
97 default:
98 }
99
100 select {
101 case b = <-cb:
102 panic("blocked bsender")
103 default:
104 }
105
106 select {
107 case s = <-cs:
108 panic("blocked ssender")
109 default:
110 }
111
112 go i32receiver(c32, sync)
113 try := 0
114 Send32:
115 for {
116 select {
117 case c32 <- 123:
118 break Send32
119 default:
120 try++
121 if try > maxTries {
122 println("i32receiver buffer=", buffer)
123 panic("fail")
124 }
125 sleep()
126 }
127 }
128 <-sync
129
130 go i32sender(c32, sync)
131 if buffer > 0 {
132 <-sync
133 }
134 try = 0
135 Recv32:
136 for {
137 select {
138 case i32 = <-c32:
139 break Recv32
140 default:
141 try++
142 if try > maxTries {
143 println("i32sender buffer=", buffer)
144 panic("fail")
145 }
146 sleep()
147 }
148 }
149 if i32 != 234 {
150 panic("i32sender value")
151 }
152 if buffer == 0 {
153 <-sync
154 }
155
156 go i64receiver(c64, sync)
157 try = 0
158 Send64:
159 for {
160 select {
161 case c64 <- 123456:
162 break Send64
163 default:
164 try++
165 if try > maxTries {
166 panic("i64receiver")
167 }
168 sleep()
169 }
170 }
171 <-sync
172
173 go i64sender(c64, sync)
174 if buffer > 0 {
175 <-sync
176 }
177 try = 0
178 Recv64:
179 for {
180 select {
181 case i64 = <-c64:
182 break Recv64
183 default:
184 try++
185 if try > maxTries {
186 panic("i64sender")
187 }
188 sleep()
189 }
190 }
191 if i64 != 234567 {
192 panic("i64sender value")
193 }
194 if buffer == 0 {
195 <-sync
196 }
197
198 go breceiver(cb, sync)
199 try = 0
200 SendBool:
201 for {
202 select {
203 case cb <- true:
204 break SendBool
205 default:
206 try++
207 if try > maxTries {
208 panic("breceiver")
209 }
210 sleep()
211 }
212 }
213 <-sync
214
215 go bsender(cb, sync)
216 if buffer > 0 {
217 <-sync
218 }
219 try = 0
220 RecvBool:
221 for {
222 select {
223 case b = <-cb:
224 break RecvBool
225 default:
226 try++
227 if try > maxTries {
228 panic("bsender")
229 }
230 sleep()
231 }
232 }
233 if !b {
234 panic("bsender value")
235 }
236 if buffer == 0 {
237 <-sync
238 }
239
240 go sreceiver(cs, sync)
241 try = 0
242 SendString:
243 for {
244 select {
245 case cs <- "hello":
246 break SendString
247 default:
248 try++
249 if try > maxTries {
250 panic("sreceiver")
251 }
252 sleep()
253 }
254 }
255 <-sync
256
257 go ssender(cs, sync)
258 if buffer > 0 {
259 <-sync
260 }
261 try = 0
262 RecvString:
263 for {
264 select {
265 case s = <-cs:
266 break RecvString
267 default:
268 try++
269 if try > maxTries {
270 panic("ssender")
271 }
272 sleep()
273 }
274 }
275 if s != "hello again" {
276 panic("ssender value")
277 }
278 if buffer == 0 {
279 <-sync
280 }
281 }
282 }
283
View as plain text