modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/chan/nonblock.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 channel operations that test for blocking. 8 // Use several sizes and types of operands. 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) // 10 us 64 func sleep() { 65 <-ticker 66 <-ticker 67 runtime.Gosched() 68 runtime.Gosched() 69 runtime.Gosched() 70 } 71 72 const maxTries = 10000 // Up to 100ms per test. 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 }