summaryrefslogtreecommitdiff
path: root/src/pkg/sync/waitgroup_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/sync/waitgroup_test.go')
-rw-r--r--src/pkg/sync/waitgroup_test.go148
1 files changed, 0 insertions, 148 deletions
diff --git a/src/pkg/sync/waitgroup_test.go b/src/pkg/sync/waitgroup_test.go
deleted file mode 100644
index 4c0a043c0..000000000
--- a/src/pkg/sync/waitgroup_test.go
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2011 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.
-
-package sync_test
-
-import (
- . "sync"
- "sync/atomic"
- "testing"
-)
-
-func testWaitGroup(t *testing.T, wg1 *WaitGroup, wg2 *WaitGroup) {
- n := 16
- wg1.Add(n)
- wg2.Add(n)
- exited := make(chan bool, n)
- for i := 0; i != n; i++ {
- go func(i int) {
- wg1.Done()
- wg2.Wait()
- exited <- true
- }(i)
- }
- wg1.Wait()
- for i := 0; i != n; i++ {
- select {
- case <-exited:
- t.Fatal("WaitGroup released group too soon")
- default:
- }
- wg2.Done()
- }
- for i := 0; i != n; i++ {
- <-exited // Will block if barrier fails to unlock someone.
- }
-}
-
-func TestWaitGroup(t *testing.T) {
- wg1 := &WaitGroup{}
- wg2 := &WaitGroup{}
-
- // Run the same test a few times to ensure barrier is in a proper state.
- for i := 0; i != 8; i++ {
- testWaitGroup(t, wg1, wg2)
- }
-}
-
-func TestWaitGroupMisuse(t *testing.T) {
- defer func() {
- err := recover()
- if err != "sync: negative WaitGroup counter" {
- t.Fatalf("Unexpected panic: %#v", err)
- }
- }()
- wg := &WaitGroup{}
- wg.Add(1)
- wg.Done()
- wg.Done()
- t.Fatal("Should panic")
-}
-
-func TestWaitGroupRace(t *testing.T) {
- // Run this test for about 1ms.
- for i := 0; i < 1000; i++ {
- wg := &WaitGroup{}
- n := new(int32)
- // spawn goroutine 1
- wg.Add(1)
- go func() {
- atomic.AddInt32(n, 1)
- wg.Done()
- }()
- // spawn goroutine 2
- wg.Add(1)
- go func() {
- atomic.AddInt32(n, 1)
- wg.Done()
- }()
- // Wait for goroutine 1 and 2
- wg.Wait()
- if atomic.LoadInt32(n) != 2 {
- t.Fatal("Spurious wakeup from Wait")
- }
- }
-}
-
-func BenchmarkWaitGroupUncontended(b *testing.B) {
- type PaddedWaitGroup struct {
- WaitGroup
- pad [128]uint8
- }
- b.RunParallel(func(pb *testing.PB) {
- var wg PaddedWaitGroup
- for pb.Next() {
- wg.Add(1)
- wg.Done()
- wg.Wait()
- }
- })
-}
-
-func benchmarkWaitGroupAddDone(b *testing.B, localWork int) {
- var wg WaitGroup
- b.RunParallel(func(pb *testing.PB) {
- foo := 0
- for pb.Next() {
- wg.Add(1)
- for i := 0; i < localWork; i++ {
- foo *= 2
- foo /= 2
- }
- wg.Done()
- }
- _ = foo
- })
-}
-
-func BenchmarkWaitGroupAddDone(b *testing.B) {
- benchmarkWaitGroupAddDone(b, 0)
-}
-
-func BenchmarkWaitGroupAddDoneWork(b *testing.B) {
- benchmarkWaitGroupAddDone(b, 100)
-}
-
-func benchmarkWaitGroupWait(b *testing.B, localWork int) {
- var wg WaitGroup
- b.RunParallel(func(pb *testing.PB) {
- foo := 0
- for pb.Next() {
- wg.Wait()
- for i := 0; i < localWork; i++ {
- foo *= 2
- foo /= 2
- }
- }
- _ = foo
- })
-}
-
-func BenchmarkWaitGroupWait(b *testing.B) {
- benchmarkWaitGroupWait(b, 0)
-}
-
-func BenchmarkWaitGroupWaitWork(b *testing.B) {
- benchmarkWaitGroupWait(b, 100)
-}