diff options
Diffstat (limited to 'src/pkg/sync/waitgroup_test.go')
-rw-r--r-- | src/pkg/sync/waitgroup_test.go | 148 |
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) -} |