diff --git a/testdata/channel.go b/testdata/channel.go index 63011d50..52d498fc 100644 --- a/testdata/channel.go +++ b/testdata/channel.go @@ -2,45 +2,17 @@ package main import ( "runtime" + "sync" "time" ) -// waitGroup is a small type reimplementing some of the behavior of sync.WaitGroup -type waitGroup uint - -func (wg *waitGroup) wait() { - n := 0 - for *wg != 0 { - // pause and wait to be rescheduled - runtime.Gosched() - - if n > 100 { - // if something is using the sleep queue, this may be necessary - time.Sleep(time.Millisecond) - } - - n++ - } -} - -func (wg *waitGroup) add(n uint) { - *wg += waitGroup(n) -} - -func (wg *waitGroup) done() { - if *wg == 0 { - panic("wait group underflow") - } - *wg-- -} - -var wg waitGroup +var wg sync.WaitGroup func main() { ch := make(chan int) println("len, cap of channel:", len(ch), cap(ch), ch == nil) - wg.add(1) + wg.Add(1) go sender(ch) n, ok := <-ch @@ -50,7 +22,7 @@ func main() { println("received num:", n) } - wg.wait() + wg.Wait() n, ok = <-ch println("recv from closed channel:", n, ok) @@ -66,55 +38,55 @@ func main() { // Test bigger values ch2 := make(chan complex128) - wg.add(1) + wg.Add(1) go sendComplex(ch2) println("complex128:", <-ch2) - wg.wait() + wg.Wait() // Test multi-sender. ch = make(chan int) - wg.add(3) + wg.Add(3) go fastsender(ch, 10) go fastsender(ch, 23) go fastsender(ch, 40) slowreceiver(ch) - wg.wait() + wg.Wait() // Test multi-receiver. ch = make(chan int) - wg.add(3) + wg.Add(3) go fastreceiver(ch) go fastreceiver(ch) go fastreceiver(ch) slowsender(ch) - wg.wait() + wg.Wait() // Test iterator style channel. ch = make(chan int) - wg.add(1) + wg.Add(1) go iterator(ch, 100) sum := 0 for i := range ch { sum += i } - wg.wait() + wg.Wait() println("sum(100):", sum) // Test simple selects. go selectDeadlock() // cannot use waitGroup here - never terminates - wg.add(1) + wg.Add(1) go selectNoOp() - wg.wait() + wg.Wait() // Test select with a single send operation (transformed into chan send). ch = make(chan int) - wg.add(1) + wg.Add(1) go fastreceiver(ch) select { case ch <- 5: } close(ch) - wg.wait() + wg.Wait() println("did send one") // Test select with a single recv operation (transformed into chan recv). @@ -125,11 +97,11 @@ func main() { // Test select recv with channel that has one entry. ch = make(chan int) - wg.add(1) + wg.Add(1) go func(ch chan int) { runtime.Gosched() ch <- 55 - wg.done() + wg.Done() }(ch) select { case make(chan int) <- 3: @@ -141,7 +113,7 @@ func main() { case n := <-make(chan int): println("unreachable:", n) } - wg.wait() + wg.Wait() // Test select recv with closed channel. close(ch) @@ -156,7 +128,7 @@ func main() { // Test select send. ch = make(chan int) - wg.add(1) + wg.Add(1) go fastreceiver(ch) select { case ch <- 235: @@ -165,7 +137,7 @@ func main() { println("unreachable:", n) } close(ch) - wg.wait() + wg.Wait() // test non-concurrent buffered channels ch = make(chan int, 2) @@ -183,7 +155,7 @@ func main() { println("closed buffered channel recieve:", <-ch) // test using buffered channels as regular channels with special properties - wg.add(6) + wg.Add(6) ch = make(chan int, 2) go send(ch) go send(ch) @@ -191,7 +163,7 @@ func main() { go send(ch) go receive(ch) go receive(ch) - wg.wait() + wg.Wait() close(ch) var count int for range ch { @@ -204,19 +176,19 @@ func main() { sch1 := make(chan int) sch2 := make(chan int) sch3 := make(chan int) - wg.add(3) + wg.Add(3) go func() { - defer wg.done() + defer wg.Done() time.Sleep(time.Millisecond) sch1 <- 1 }() go func() { - defer wg.done() + defer wg.Done() time.Sleep(time.Millisecond) sch2 <- 2 }() go func() { - defer wg.done() + defer wg.Done() // merge sch2 and sch3 into ch for i := 0; i < 2; i++ { var v int @@ -240,18 +212,18 @@ func main() { sum += v } } - wg.wait() + wg.Wait() println("blocking select sum:", sum) } func send(ch chan<- int) { ch <- 1 - wg.done() + wg.Done() } func receive(ch <-chan int) { <-ch - wg.done() + wg.Done() } func sender(ch chan int) { @@ -263,18 +235,18 @@ func sender(ch chan int) { ch <- i } close(ch) - wg.done() + wg.Done() } func sendComplex(ch chan complex128) { ch <- 7 + 10.5i - wg.done() + wg.Done() } func fastsender(ch chan int, n int) { ch <- n ch <- n + 1 - wg.done() + wg.Done() } func slowreceiver(ch chan int) { @@ -300,7 +272,7 @@ func fastreceiver(ch chan int) { sum += n } println("sum:", sum) - wg.done() + wg.Done() } func iterator(ch chan int, top int) { @@ -308,7 +280,7 @@ func iterator(ch chan int, top int) { ch <- i } close(ch) - wg.done() + wg.Done() } func selectDeadlock() { @@ -323,5 +295,5 @@ func selectNoOp() { default: } println("after no-op") - wg.done() + wg.Done() }