| // 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 | 
 | 		} | 
 | 	} | 
 | } |