| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | // $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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | // Test close(c), receive of closed channel. | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | // | 
					
						
							|  |  |  | // TODO(rsc): Doesn't check behavior of close(c) when there | 
					
						
							|  |  |  | // are blocked senders/receivers. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Chan interface { | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	Send(int) | 
					
						
							|  |  |  | 	Nbsend(int) bool | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | 	Recv() (int) | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	Nbrecv() (int, bool) | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | 	Recv2() (int, bool) | 
					
						
							|  |  |  | 	Nbrecv2() (int, bool, bool) | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	Close() | 
					
						
							|  |  |  | 	Impl() string | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-31 18:36:28 -05:00
										 |  |  | // direct channel operations when possible | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | type XChan chan int | 
					
						
							| 
									
										
										
										
											2011-01-31 18:36:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | func (c XChan) Send(x int) { | 
					
						
							|  |  |  | 	c <- x | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c XChan) Nbsend(x int) bool { | 
					
						
							| 
									
										
										
										
											2011-01-31 18:36:28 -05:00
										 |  |  | 	select { | 
					
						
							|  |  |  | 	case c <- x: | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	panic("nbsend") | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c XChan) Recv() int { | 
					
						
							|  |  |  | 	return <-c | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c XChan) Nbrecv() (int, bool) { | 
					
						
							| 
									
										
										
										
											2011-01-31 18:36:28 -05:00
										 |  |  | 	select { | 
					
						
							|  |  |  | 	case x := <-c: | 
					
						
							|  |  |  | 		return x, true | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return 0, false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	panic("nbrecv") | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | func (c XChan) Recv2() (int, bool) { | 
					
						
							|  |  |  | 	x, ok := <-c | 
					
						
							|  |  |  | 	return x, ok | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c XChan) Nbrecv2() (int, bool, bool) { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	case x, ok := <-c: | 
					
						
							|  |  |  | 		return x, ok, true | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return 0, false, false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	panic("nbrecv2") | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | func (c XChan) Close() { | 
					
						
							|  |  |  | 	close(c) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c XChan) Impl() string { | 
					
						
							|  |  |  | 	return "(<- operator)" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // indirect operations via select | 
					
						
							|  |  |  | type SChan chan int | 
					
						
							| 
									
										
										
										
											2011-01-31 18:36:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | func (c SChan) Send(x int) { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	case c <- x: | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c SChan) Nbsend(x int) bool { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 		return false | 
					
						
							| 
									
										
										
										
											2011-01-31 18:36:28 -05:00
										 |  |  | 	case c <- x: | 
					
						
							|  |  |  | 		return true | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	panic("nbsend") | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c SChan) Recv() int { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	case x := <-c: | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 		return x | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	panic("recv") | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c SChan) Nbrecv() (int, bool) { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 		return 0, false | 
					
						
							| 
									
										
										
										
											2011-01-31 18:36:28 -05:00
										 |  |  | 	case x := <-c: | 
					
						
							|  |  |  | 		return x, true | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	panic("nbrecv") | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | func (c SChan) Recv2() (int, bool) { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	case x, ok := <-c: | 
					
						
							|  |  |  | 		return x, ok | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	panic("recv") | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | func (c SChan) Nbrecv2() (int, bool, bool) { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return 0, false, false | 
					
						
							|  |  |  | 	case x, ok := <-c: | 
					
						
							|  |  |  | 		return x, ok, true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	panic("nbrecv") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c SChan) Close() { | 
					
						
							|  |  |  | 	close(c) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c SChan) Impl() string { | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	return "(select)" | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-31 18:36:28 -05:00
										 |  |  | // indirect operations via larger selects | 
					
						
							|  |  |  | var dummy = make(chan bool) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type SSChan chan int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c SSChan) Send(x int) { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	case c <- x: | 
					
						
							|  |  |  | 	case <-dummy: | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c SSChan) Nbsend(x int) bool { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	case <-dummy: | 
					
						
							|  |  |  | 	case c <- x: | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	panic("nbsend") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c SSChan) Recv() int { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	case <-dummy: | 
					
						
							|  |  |  | 	case x := <-c: | 
					
						
							|  |  |  | 		return x | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	panic("recv") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c SSChan) Nbrecv() (int, bool) { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	case <-dummy: | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return 0, false | 
					
						
							|  |  |  | 	case x := <-c: | 
					
						
							|  |  |  | 		return x, true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	panic("nbrecv") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | func (c SSChan) Recv2() (int, bool) { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	case <-dummy: | 
					
						
							|  |  |  | 	case x, ok := <-c: | 
					
						
							|  |  |  | 		return x, ok | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	panic("recv") | 
					
						
							| 
									
										
										
										
											2011-01-31 18:36:28 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | func (c SSChan) Nbrecv2() (int, bool, bool) { | 
					
						
							|  |  |  | 	select { | 
					
						
							|  |  |  | 	case <-dummy: | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return 0, false, false | 
					
						
							|  |  |  | 	case x, ok := <-c: | 
					
						
							|  |  |  | 		return x, ok, true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	panic("nbrecv") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c SSChan) Close() { | 
					
						
							|  |  |  | 	close(c) | 
					
						
							| 
									
										
										
										
											2011-01-31 18:36:28 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c SSChan) Impl() string { | 
					
						
							|  |  |  | 	return "(select)" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												spec, runtime, tests: send on closed channel panics
Close of closed channel panics.
Receive from closed channel never panics,
even if done repeatedly.
Fixes #1349.
Fixes #1419.
R=gri, iant, ken2, r, gri1, r2, iant2, rog, albert.strasheim, niemeyer, ejsherry
CC=golang-dev
https://golang.org/cl/3989042
											
										 
											2011-01-21 15:07:13 -05:00
										 |  |  | func shouldPanic(f func()) { | 
					
						
							|  |  |  | 	defer func() { | 
					
						
							|  |  |  | 		if recover() == nil { | 
					
						
							|  |  |  | 			panic("did not panic") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 	f() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | func test1(c Chan) { | 
					
						
							|  |  |  | 	for i := 0; i < 3; i++ { | 
					
						
							|  |  |  | 		// recv a close signal (a zero value) | 
					
						
							|  |  |  | 		if x := c.Recv(); x != 0 { | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | 			println("test1: recv on closed:", x, c.Impl()) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | 		if x, ok := c.Recv2(); x != 0 || ok { | 
					
						
							|  |  |  | 			println("test1: recv2 on closed:", x, ok, c.Impl()) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | 		// should work with select: received a value without blocking, so selected == true. | 
					
						
							|  |  |  | 		x, selected := c.Nbrecv() | 
					
						
							|  |  |  | 		if x != 0 || !selected { | 
					
						
							|  |  |  | 			println("test1: recv on closed nb:", x, selected, c.Impl()) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | 		x, ok, selected := c.Nbrecv2() | 
					
						
							|  |  |  | 		if x != 0 || ok || !selected { | 
					
						
							|  |  |  | 			println("test1: recv2 on closed nb:", x, ok, selected, c.Impl()) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// send should work with ,ok too: sent a value without blocking, so ok == true. | 
					
						
							| 
									
										
										
										
											2011-01-31 18:36:28 -05:00
										 |  |  | 	shouldPanic(func() { c.Nbsend(1) }) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
											
												spec, runtime, tests: send on closed channel panics
Close of closed channel panics.
Receive from closed channel never panics,
even if done repeatedly.
Fixes #1349.
Fixes #1419.
R=gri, iant, ken2, r, gri1, r2, iant2, rog, albert.strasheim, niemeyer, ejsherry
CC=golang-dev
https://golang.org/cl/3989042
											
										 
											2011-01-21 15:07:13 -05:00
										 |  |  | 	// the value should have been discarded. | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 	if x := c.Recv(); x != 0 { | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 		println("test1: recv on closed got non-zero after send on closed:", x, c.Impl()) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// similarly Send. | 
					
						
							| 
									
										
										
										
											2011-01-31 18:36:28 -05:00
										 |  |  | 	shouldPanic(func() { c.Send(2) }) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 	if x := c.Recv(); x != 0 { | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 		println("test1: recv on closed got non-zero after send on closed:", x, c.Impl()) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func testasync1(c Chan) { | 
					
						
							|  |  |  | 	// should be able to get the last value via Recv | 
					
						
							|  |  |  | 	if x := c.Recv(); x != 1 { | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 		println("testasync1: Recv did not get 1:", x, c.Impl()) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	test1(c) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func testasync2(c Chan) { | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | 	// should be able to get the last value via Recv2 | 
					
						
							|  |  |  | 	if x, ok := c.Recv2(); x != 1 || !ok { | 
					
						
							|  |  |  | 		println("testasync1: Recv did not get 1, true:", x, ok, c.Impl()) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | 	test1(c) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func testasync3(c Chan) { | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 	// should be able to get the last value via Nbrecv | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | 	if x, selected := c.Nbrecv(); x != 1 || !selected { | 
					
						
							|  |  |  | 		println("testasync2: Nbrecv did not get 1, true:", x, selected, c.Impl()) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	test1(c) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | func testasync4(c Chan) { | 
					
						
							|  |  |  | 	// should be able to get the last value via Nbrecv2 | 
					
						
							|  |  |  | 	if x, ok, selected := c.Nbrecv2(); x != 1 || !ok || !selected { | 
					
						
							|  |  |  | 		println("testasync2: Nbrecv did not get 1, true, true:", x, ok, selected, c.Impl()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	test1(c) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | func closedsync() chan int { | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	c := make(chan int) | 
					
						
							|  |  |  | 	close(c) | 
					
						
							|  |  |  | 	return c | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func closedasync() chan int { | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	c := make(chan int, 2) | 
					
						
							|  |  |  | 	c <- 1 | 
					
						
							|  |  |  | 	close(c) | 
					
						
							|  |  |  | 	return c | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | var mks = []func(chan int) Chan { | 
					
						
							|  |  |  | 	func(c chan int) Chan { return XChan(c) }, | 
					
						
							|  |  |  | 	func(c chan int) Chan { return SChan(c) }, | 
					
						
							|  |  |  | 	func(c chan int) Chan { return SSChan(c) }, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var testcloseds = []func(Chan) { | 
					
						
							|  |  |  | 	testasync1, | 
					
						
							|  |  |  | 	testasync2, | 
					
						
							|  |  |  | 	testasync3, | 
					
						
							|  |  |  | 	testasync4, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | func main() { | 
					
						
							| 
									
										
										
										
											2011-03-11 14:47:44 -05:00
										 |  |  | 	for _, mk := range mks { | 
					
						
							|  |  |  | 		test1(mk(closedsync())) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	for _, testclosed := range testcloseds { | 
					
						
							|  |  |  | 		for _, mk := range mks { | 
					
						
							|  |  |  | 			testclosed(mk(closedasync())) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-10-13 16:58:04 -04:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	var ch chan int	 | 
					
						
							|  |  |  | 	shouldPanic(func() { | 
					
						
							|  |  |  | 		close(ch) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	ch = make(chan int) | 
					
						
							|  |  |  | 	close(ch) | 
					
						
							|  |  |  | 	shouldPanic(func() { | 
					
						
							|  |  |  | 		close(ch) | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2009-03-23 18:50:35 -07:00
										 |  |  | } |