// $G $D/$F.go && $L $F.$A && ./$A.out

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

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