| // $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 |
| |
| func pause() { |
| for i:=0; i<100; i++ { sys.gosched() } |
| } |
| |
| func i32receiver(c *chan int32) { |
| if <-c != 123 { panic "i32 value" } |
| } |
| |
| func i32sender(c *chan int32) { |
| c -< 234 |
| } |
| |
| func i64receiver(c *chan int64) { |
| if <-c != 123456 { panic "i64 value" } |
| } |
| |
| func i64sender(c *chan int64) { |
| c -< 234567 |
| } |
| |
| func breceiver(c *chan bool) { |
| if ! <-c { panic "b value" } |
| } |
| |
| func bsender(c *chan bool) { |
| c -< true |
| } |
| |
| func sreceiver(c *chan string) { |
| if <-c != "hello" { panic "s value" } |
| } |
| |
| func ssender(c *chan string) { |
| c -< "hello again" |
| } |
| |
| func main() { |
| var i32 int32; |
| var i64 int64; |
| var b bool; |
| var s string; |
| var ok bool; |
| |
| c32 := new(chan int32); |
| c64 := new(chan int64); |
| cb := new(chan bool); |
| cs := new(chan string); |
| |
| i32, ok = <-c32; |
| if ok { panic "blocked i32sender" } |
| |
| i64, ok = <-c64; |
| if ok { panic "blocked i64sender" } |
| |
| b, ok = <-cb; |
| if ok { panic "blocked bsender" } |
| |
| s, ok = <-cs; |
| if ok { panic "blocked ssender" } |
| |
| go i32receiver(c32); |
| pause(); |
| ok = c32 -< 123; |
| if !ok { panic "i32receiver" } |
| go i32sender(c32); |
| pause(); |
| i32, ok = <-c32; |
| if !ok { panic "i32sender" } |
| if i32 != 234 { panic "i32sender value" } |
| |
| go i64receiver(c64); |
| pause(); |
| ok = c64 -< 123456; |
| if !ok { panic "i64receiver" } |
| go i64sender(c64); |
| pause(); |
| i64, ok = <-c64; |
| if !ok { panic "i64sender" } |
| if i64 != 234567 { panic "i64sender value" } |
| |
| go breceiver(cb); |
| pause(); |
| ok = cb -< true; |
| if !ok { panic "breceiver" } |
| go bsender(cb); |
| pause(); |
| b, ok = <-cb; |
| if !ok { panic "bsender" } |
| if !b{ panic "bsender value" } |
| |
| go sreceiver(cs); |
| pause(); |
| ok = cs -< "hello"; |
| if !ok { panic "sreceiver" } |
| go ssender(cs); |
| pause(); |
| s, ok = <-cs; |
| if !ok { panic "ssender" } |
| if s != "hello again" { panic "ssender value" } |
| print "PASS\n" |
| } |