61
60
t.Fatal("Should panic")
63
func TestWaitGroupRace(t *testing.T) {
64
// Run this test for about 1ms.
65
for i := 0; i < 1000; i++ {
80
// Wait for goroutine 1 and 2
82
if atomic.LoadInt32(n) != 2 {
83
t.Fatal("Spurious wakeup from Wait")
64
88
func BenchmarkWaitGroupUncontended(b *testing.B) {
65
89
type PaddedWaitGroup struct {
69
const CallsPerSched = 1000
70
procs := runtime.GOMAXPROCS(-1)
71
N := int32(b.N / CallsPerSched)
72
c := make(chan bool, procs)
73
for p := 0; p < procs; p++ {
75
var wg PaddedWaitGroup
76
for atomic.AddInt32(&N, -1) >= 0 {
78
for g := 0; g < CallsPerSched; g++ {
87
for p := 0; p < procs; p++ {
93
b.RunParallel(func(pb *testing.PB) {
94
var wg PaddedWaitGroup
92
103
func benchmarkWaitGroupAddDone(b *testing.B, localWork int) {
93
const CallsPerSched = 1000
94
procs := runtime.GOMAXPROCS(-1)
95
N := int32(b.N / CallsPerSched)
96
c := make(chan bool, procs)
98
for p := 0; p < procs; p++ {
101
for atomic.AddInt32(&N, -1) >= 0 {
103
for g := 0; g < CallsPerSched; g++ {
105
for i := 0; i < localWork; i++ {
105
b.RunParallel(func(pb *testing.PB) {
109
for i := 0; i < localWork; i++ {
115
for p := 0; p < procs; p++ {
120
119
func BenchmarkWaitGroupAddDone(b *testing.B) {
128
127
func benchmarkWaitGroupWait(b *testing.B, localWork int) {
129
const CallsPerSched = 1000
130
procs := runtime.GOMAXPROCS(-1)
131
N := int32(b.N / CallsPerSched)
132
c := make(chan bool, procs)
135
for p := 0; p < procs; p++ {
138
for p := 0; p < procs; p++ {
141
for atomic.AddInt32(&N, -1) >= 0 {
143
for g := 0; g < CallsPerSched; g++ {
145
for i := 0; i < localWork; i++ {
129
b.RunParallel(func(pb *testing.PB) {
133
for i := 0; i < localWork; i++ {
154
for p := 0; p < procs; p++ {
159
142
func BenchmarkWaitGroupWait(b *testing.B) {