github.com/varialus/godfly@v0.0.0-20130904042352-1934f9f095ab/src/pkg/runtime/race/testdata/chan_test.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package race_test 6 7 import ( 8 "runtime" 9 "testing" 10 "time" 11 ) 12 13 func TestNoRaceChanSync(t *testing.T) { 14 v := 0 15 c := make(chan int) 16 go func() { 17 v = 1 18 c <- 0 19 }() 20 <-c 21 v = 2 22 } 23 24 func TestNoRaceChanSyncRev(t *testing.T) { 25 v := 0 26 c := make(chan int) 27 go func() { 28 c <- 0 29 v = 2 30 }() 31 v = 1 32 <-c 33 } 34 35 func TestNoRaceChanAsync(t *testing.T) { 36 v := 0 37 c := make(chan int, 10) 38 go func() { 39 v = 1 40 c <- 0 41 }() 42 <-c 43 v = 2 44 } 45 46 func TestRaceChanAsyncRev(t *testing.T) { 47 v := 0 48 c := make(chan int, 10) 49 go func() { 50 c <- 0 51 v = 1 52 }() 53 v = 2 54 <-c 55 } 56 57 func TestNoRaceChanAsyncCloseRecv(t *testing.T) { 58 v := 0 59 c := make(chan int, 10) 60 go func() { 61 v = 1 62 close(c) 63 }() 64 func() { 65 defer func() { 66 recover() 67 v = 2 68 }() 69 <-c 70 }() 71 } 72 73 func TestNoRaceChanAsyncCloseRecv2(t *testing.T) { 74 v := 0 75 c := make(chan int, 10) 76 go func() { 77 v = 1 78 close(c) 79 }() 80 _, _ = <-c 81 v = 2 82 } 83 84 func TestNoRaceChanAsyncCloseRecv3(t *testing.T) { 85 v := 0 86 c := make(chan int, 10) 87 go func() { 88 v = 1 89 close(c) 90 }() 91 for _ = range c { 92 } 93 v = 2 94 } 95 96 func TestNoRaceChanSyncCloseRecv(t *testing.T) { 97 v := 0 98 c := make(chan int) 99 go func() { 100 v = 1 101 close(c) 102 }() 103 func() { 104 defer func() { 105 recover() 106 v = 2 107 }() 108 <-c 109 }() 110 } 111 112 func TestNoRaceChanSyncCloseRecv2(t *testing.T) { 113 v := 0 114 c := make(chan int) 115 go func() { 116 v = 1 117 close(c) 118 }() 119 _, _ = <-c 120 v = 2 121 } 122 123 func TestNoRaceChanSyncCloseRecv3(t *testing.T) { 124 v := 0 125 c := make(chan int) 126 go func() { 127 v = 1 128 close(c) 129 }() 130 for _ = range c { 131 } 132 v = 2 133 } 134 135 func TestRaceChanSyncCloseSend(t *testing.T) { 136 v := 0 137 c := make(chan int) 138 go func() { 139 v = 1 140 close(c) 141 }() 142 func() { 143 defer func() { 144 recover() 145 }() 146 c <- 0 147 }() 148 v = 2 149 } 150 151 func TestRaceChanAsyncCloseSend(t *testing.T) { 152 v := 0 153 c := make(chan int, 10) 154 go func() { 155 v = 1 156 close(c) 157 }() 158 func() { 159 defer func() { 160 recover() 161 }() 162 for { 163 c <- 0 164 } 165 }() 166 v = 2 167 } 168 169 func TestRaceChanCloseClose(t *testing.T) { 170 compl := make(chan bool, 2) 171 v1 := 0 172 v2 := 0 173 c := make(chan int) 174 go func() { 175 defer func() { 176 if recover() != nil { 177 v2 = 2 178 } 179 compl <- true 180 }() 181 v1 = 1 182 close(c) 183 }() 184 go func() { 185 defer func() { 186 if recover() != nil { 187 v1 = 2 188 } 189 compl <- true 190 }() 191 v2 = 1 192 close(c) 193 }() 194 <-compl 195 <-compl 196 } 197 198 func TestRaceChanSendLen(t *testing.T) { 199 v := 0 200 c := make(chan int, 10) 201 go func() { 202 v = 1 203 c <- 1 204 }() 205 for len(c) == 0 { 206 runtime.Gosched() 207 } 208 v = 2 209 } 210 211 func TestRaceChanRecvLen(t *testing.T) { 212 v := 0 213 c := make(chan int, 10) 214 c <- 1 215 go func() { 216 v = 1 217 <-c 218 }() 219 for len(c) != 0 { 220 runtime.Gosched() 221 } 222 v = 2 223 } 224 225 func TestRaceChanSendSend(t *testing.T) { 226 compl := make(chan bool, 2) 227 v1 := 0 228 v2 := 0 229 c := make(chan int, 1) 230 go func() { 231 v1 = 1 232 select { 233 case c <- 1: 234 default: 235 v2 = 2 236 } 237 compl <- true 238 }() 239 go func() { 240 v2 = 1 241 select { 242 case c <- 1: 243 default: 244 v1 = 2 245 } 246 compl <- true 247 }() 248 <-compl 249 <-compl 250 } 251 252 func TestNoRaceChanPtr(t *testing.T) { 253 type msg struct { 254 x int 255 } 256 c := make(chan *msg) 257 go func() { 258 c <- &msg{1} 259 }() 260 m := <-c 261 m.x = 2 262 } 263 264 func TestRaceChanWrongSend(t *testing.T) { 265 v1 := 0 266 v2 := 0 267 c := make(chan int, 2) 268 go func() { 269 v1 = 1 270 c <- 1 271 }() 272 go func() { 273 v2 = 2 274 c <- 2 275 }() 276 time.Sleep(1e7) 277 if <-c == 1 { 278 v2 = 3 279 } else { 280 v1 = 3 281 } 282 } 283 284 func TestRaceChanWrongClose(t *testing.T) { 285 v1 := 0 286 v2 := 0 287 c := make(chan int, 1) 288 go func() { 289 defer func() { 290 recover() 291 }() 292 v1 = 1 293 c <- 1 294 }() 295 go func() { 296 time.Sleep(1e7) 297 v2 = 2 298 close(c) 299 }() 300 time.Sleep(2e7) 301 if _, who := <-c; who { 302 v2 = 2 303 } else { 304 v1 = 2 305 } 306 } 307 308 func TestRaceChanSendClose(t *testing.T) { 309 compl := make(chan bool, 2) 310 c := make(chan int, 1) 311 go func() { 312 defer func() { 313 recover() 314 compl <- true 315 }() 316 c <- 1 317 }() 318 go func() { 319 time.Sleep(10 * time.Millisecond) 320 close(c) 321 compl <- true 322 }() 323 <-compl 324 <-compl 325 } 326 327 func TestRaceChanSendSelectClose(t *testing.T) { 328 compl := make(chan bool, 2) 329 c := make(chan int, 1) 330 c1 := make(chan int) 331 go func() { 332 defer func() { 333 recover() 334 compl <- true 335 }() 336 time.Sleep(10 * time.Millisecond) 337 select { 338 case c <- 1: 339 case <-c1: 340 } 341 }() 342 go func() { 343 close(c) 344 compl <- true 345 }() 346 <-compl 347 <-compl 348 } 349 350 func TestNoRaceProducerConsumerUnbuffered(t *testing.T) { 351 type Task struct { 352 f func() 353 done chan bool 354 } 355 356 queue := make(chan Task) 357 358 go func() { 359 t := <-queue 360 t.f() 361 t.done <- true 362 }() 363 364 doit := func(f func()) { 365 done := make(chan bool, 1) 366 queue <- Task{f, done} 367 <-done 368 } 369 370 x := 0 371 doit(func() { 372 x = 1 373 }) 374 _ = x 375 } 376 377 func TestRaceChanItselfSend(t *testing.T) { 378 compl := make(chan bool, 1) 379 c := make(chan int, 10) 380 go func() { 381 c <- 0 382 compl <- true 383 }() 384 c = make(chan int, 20) 385 <-compl 386 } 387 388 func TestRaceChanItselfRecv(t *testing.T) { 389 compl := make(chan bool, 1) 390 c := make(chan int, 10) 391 c <- 1 392 go func() { 393 <-c 394 compl <- true 395 }() 396 time.Sleep(1e7) 397 c = make(chan int, 20) 398 <-compl 399 } 400 401 func TestRaceChanItselfNil(t *testing.T) { 402 c := make(chan int, 10) 403 go func() { 404 c <- 0 405 }() 406 time.Sleep(1e7) 407 c = nil 408 _ = c 409 } 410 411 func TestRaceChanItselfClose(t *testing.T) { 412 compl := make(chan bool, 1) 413 c := make(chan int) 414 go func() { 415 close(c) 416 compl <- true 417 }() 418 c = make(chan int) 419 <-compl 420 } 421 422 func TestRaceChanItselfLen(t *testing.T) { 423 compl := make(chan bool, 1) 424 c := make(chan int) 425 go func() { 426 _ = len(c) 427 compl <- true 428 }() 429 c = make(chan int) 430 <-compl 431 } 432 433 func TestRaceChanItselfCap(t *testing.T) { 434 compl := make(chan bool, 1) 435 c := make(chan int) 436 go func() { 437 _ = cap(c) 438 compl <- true 439 }() 440 c = make(chan int) 441 <-compl 442 } 443 444 func TestRaceChanCloseLen(t *testing.T) { 445 v := 0 446 c := make(chan int, 10) 447 c <- 0 448 go func() { 449 v = 1 450 close(c) 451 }() 452 time.Sleep(1e7) 453 _ = len(c) 454 v = 2 455 } 456 457 func TestRaceChanSameCell(t *testing.T) { 458 c := make(chan int, 1) 459 v := 0 460 go func() { 461 v = 1 462 c <- 42 463 <-c 464 }() 465 time.Sleep(1e7) 466 c <- 43 467 <-c 468 _ = v 469 } 470 471 func TestRaceChanCloseSend(t *testing.T) { 472 compl := make(chan bool, 1) 473 c := make(chan int, 10) 474 go func() { 475 close(c) 476 compl <- true 477 }() 478 c <- 0 479 <-compl 480 }