|  | // run | 
|  |  | 
|  | // Copyright 2009 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | // Test channel operations that test for blocking. | 
|  | // Use several sizes and types of operands. | 
|  |  | 
|  | package main | 
|  |  | 
|  | import "runtime" | 
|  | import "time" | 
|  |  | 
|  | func i32receiver(c chan int32, strobe chan bool) { | 
|  | if <-c != 123 { | 
|  | panic("i32 value") | 
|  | } | 
|  | strobe <- true | 
|  | } | 
|  |  | 
|  | func i32sender(c chan int32, strobe chan bool) { | 
|  | c <- 234 | 
|  | strobe <- true | 
|  | } | 
|  |  | 
|  | func i64receiver(c chan int64, strobe chan bool) { | 
|  | if <-c != 123456 { | 
|  | panic("i64 value") | 
|  | } | 
|  | strobe <- true | 
|  | } | 
|  |  | 
|  | func i64sender(c chan int64, strobe chan bool) { | 
|  | c <- 234567 | 
|  | strobe <- true | 
|  | } | 
|  |  | 
|  | func breceiver(c chan bool, strobe chan bool) { | 
|  | if !<-c { | 
|  | panic("b value") | 
|  | } | 
|  | strobe <- true | 
|  | } | 
|  |  | 
|  | func bsender(c chan bool, strobe chan bool) { | 
|  | c <- true | 
|  | strobe <- true | 
|  | } | 
|  |  | 
|  | func sreceiver(c chan string, strobe chan bool) { | 
|  | if <-c != "hello" { | 
|  | panic("s value") | 
|  | } | 
|  | strobe <- true | 
|  | } | 
|  |  | 
|  | func ssender(c chan string, strobe chan bool) { | 
|  | c <- "hello again" | 
|  | strobe <- true | 
|  | } | 
|  |  | 
|  | var ticker = time.Tick(10 * 1000) // 10 us | 
|  | func sleep() { | 
|  | <-ticker | 
|  | <-ticker | 
|  | runtime.Gosched() | 
|  | runtime.Gosched() | 
|  | runtime.Gosched() | 
|  | } | 
|  |  | 
|  | const maxTries = 10000 // Up to 100ms per test. | 
|  |  | 
|  | func main() { | 
|  | var i32 int32 | 
|  | var i64 int64 | 
|  | var b bool | 
|  | var s string | 
|  |  | 
|  | var sync = make(chan bool) | 
|  |  | 
|  | for buffer := 0; buffer < 2; buffer++ { | 
|  | c32 := make(chan int32, buffer) | 
|  | c64 := make(chan int64, buffer) | 
|  | cb := make(chan bool, buffer) | 
|  | cs := make(chan string, buffer) | 
|  |  | 
|  | select { | 
|  | case i32 = <-c32: | 
|  | panic("blocked i32sender") | 
|  | default: | 
|  | } | 
|  |  | 
|  | select { | 
|  | case i64 = <-c64: | 
|  | panic("blocked i64sender") | 
|  | default: | 
|  | } | 
|  |  | 
|  | select { | 
|  | case b = <-cb: | 
|  | panic("blocked bsender") | 
|  | default: | 
|  | } | 
|  |  | 
|  | select { | 
|  | case s = <-cs: | 
|  | panic("blocked ssender") | 
|  | default: | 
|  | } | 
|  |  | 
|  | go i32receiver(c32, sync) | 
|  | try := 0 | 
|  | Send32: | 
|  | for { | 
|  | select { | 
|  | case c32 <- 123: | 
|  | break Send32 | 
|  | default: | 
|  | try++ | 
|  | if try > maxTries { | 
|  | println("i32receiver buffer=", buffer) | 
|  | panic("fail") | 
|  | } | 
|  | sleep() | 
|  | } | 
|  | } | 
|  | <-sync | 
|  |  | 
|  | go i32sender(c32, sync) | 
|  | if buffer > 0 { | 
|  | <-sync | 
|  | } | 
|  | try = 0 | 
|  | Recv32: | 
|  | for { | 
|  | select { | 
|  | case i32 = <-c32: | 
|  | break Recv32 | 
|  | default: | 
|  | try++ | 
|  | if try > maxTries { | 
|  | println("i32sender buffer=", buffer) | 
|  | panic("fail") | 
|  | } | 
|  | sleep() | 
|  | } | 
|  | } | 
|  | if i32 != 234 { | 
|  | panic("i32sender value") | 
|  | } | 
|  | if buffer == 0 { | 
|  | <-sync | 
|  | } | 
|  |  | 
|  | go i64receiver(c64, sync) | 
|  | try = 0 | 
|  | Send64: | 
|  | for { | 
|  | select { | 
|  | case c64 <- 123456: | 
|  | break Send64 | 
|  | default: | 
|  | try++ | 
|  | if try > maxTries { | 
|  | panic("i64receiver") | 
|  | } | 
|  | sleep() | 
|  | } | 
|  | } | 
|  | <-sync | 
|  |  | 
|  | go i64sender(c64, sync) | 
|  | if buffer > 0 { | 
|  | <-sync | 
|  | } | 
|  | try = 0 | 
|  | Recv64: | 
|  | for { | 
|  | select { | 
|  | case i64 = <-c64: | 
|  | break Recv64 | 
|  | default: | 
|  | try++ | 
|  | if try > maxTries { | 
|  | panic("i64sender") | 
|  | } | 
|  | sleep() | 
|  | } | 
|  | } | 
|  | if i64 != 234567 { | 
|  | panic("i64sender value") | 
|  | } | 
|  | if buffer == 0 { | 
|  | <-sync | 
|  | } | 
|  |  | 
|  | go breceiver(cb, sync) | 
|  | try = 0 | 
|  | SendBool: | 
|  | for { | 
|  | select { | 
|  | case cb <- true: | 
|  | break SendBool | 
|  | default: | 
|  | try++ | 
|  | if try > maxTries { | 
|  | panic("breceiver") | 
|  | } | 
|  | sleep() | 
|  | } | 
|  | } | 
|  | <-sync | 
|  |  | 
|  | go bsender(cb, sync) | 
|  | if buffer > 0 { | 
|  | <-sync | 
|  | } | 
|  | try = 0 | 
|  | RecvBool: | 
|  | for { | 
|  | select { | 
|  | case b = <-cb: | 
|  | break RecvBool | 
|  | default: | 
|  | try++ | 
|  | if try > maxTries { | 
|  | panic("bsender") | 
|  | } | 
|  | sleep() | 
|  | } | 
|  | } | 
|  | if !b { | 
|  | panic("bsender value") | 
|  | } | 
|  | if buffer == 0 { | 
|  | <-sync | 
|  | } | 
|  |  | 
|  | go sreceiver(cs, sync) | 
|  | try = 0 | 
|  | SendString: | 
|  | for { | 
|  | select { | 
|  | case cs <- "hello": | 
|  | break SendString | 
|  | default: | 
|  | try++ | 
|  | if try > maxTries { | 
|  | panic("sreceiver") | 
|  | } | 
|  | sleep() | 
|  | } | 
|  | } | 
|  | <-sync | 
|  |  | 
|  | go ssender(cs, sync) | 
|  | if buffer > 0 { | 
|  | <-sync | 
|  | } | 
|  | try = 0 | 
|  | RecvString: | 
|  | for { | 
|  | select { | 
|  | case s = <-cs: | 
|  | break RecvString | 
|  | default: | 
|  | try++ | 
|  | if try > maxTries { | 
|  | panic("ssender") | 
|  | } | 
|  | sleep() | 
|  | } | 
|  | } | 
|  | if s != "hello again" { | 
|  | panic("ssender value") | 
|  | } | 
|  | if buffer == 0 { | 
|  | <-sync | 
|  | } | 
|  | } | 
|  | } |