From 0ee2c2d99502f0a552d9b2ee98f1f97fed196d48 Mon Sep 17 00:00:00 2001 From: Prashant Varanasi Date: Tue, 14 Nov 2017 10:36:59 -0800 Subject: [PATCH] Concurrently modify same atomic in stress tests (#33) Currently, the stress tests start multiple goroutines, but they all have their own local atomic, so they are not concurrently modifying the same values. Return a function which can be run concurrently to modify the same atomic. --- stress_test.go | 138 +++++++++++++++++++++++++++---------------------- 1 file changed, 77 insertions(+), 61 deletions(-) diff --git a/stress_test.go b/stress_test.go index 72a65bd..b76c848 100644 --- a/stress_test.go +++ b/stress_test.go @@ -31,7 +31,7 @@ const ( _iterations = 1000 ) -var _stressTests = map[string]func(){ +var _stressTests = map[string]func() func(){ "i32": stressInt32, "i64": stressInt64, "u32": stressUint32, @@ -42,13 +42,14 @@ var _stressTests = map[string]func(){ } func TestStress(t *testing.T) { - for name, f := range _stressTests { + for name, ff := range _stressTests { t.Run(name, func(t *testing.T) { defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(_parallelism)) start := make(chan struct{}) var wg sync.WaitGroup wg.Add(_parallelism) + f := ff() for i := 0; i < _parallelism; i++ { go func() { defer wg.Done() @@ -65,8 +66,9 @@ func TestStress(t *testing.T) { } func BenchmarkStress(b *testing.B) { - for name, f := range _stressTests { + for name, ff := range _stressTests { b.Run(name, func(b *testing.B) { + f := ff() for i := 0; i < b.N; i++ { f() } @@ -74,81 +76,95 @@ func BenchmarkStress(b *testing.B) { } } -func stressInt32() { +func stressInt32() func() { var atom Int32 - atom.Load() - atom.Add(1) - atom.Sub(2) - atom.Inc() - atom.Dec() - atom.CAS(1, 0) - atom.Swap(5) - atom.Store(1) + return func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.Inc() + atom.Dec() + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + } } -func stressInt64() { +func stressInt64() func() { var atom Int64 - atom.Load() - atom.Add(1) - atom.Sub(2) - atom.Inc() - atom.Dec() - atom.CAS(1, 0) - atom.Swap(5) - atom.Store(1) + return func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.Inc() + atom.Dec() + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + } } -func stressUint32() { +func stressUint32() func() { var atom Uint32 - atom.Load() - atom.Add(1) - atom.Sub(2) - atom.Inc() - atom.Dec() - atom.CAS(1, 0) - atom.Swap(5) - atom.Store(1) + return func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.Inc() + atom.Dec() + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + } } -func stressUint64() { +func stressUint64() func() { var atom Uint64 - atom.Load() - atom.Add(1) - atom.Sub(2) - atom.Inc() - atom.Dec() - atom.CAS(1, 0) - atom.Swap(5) - atom.Store(1) + return func() { + atom.Load() + atom.Add(1) + atom.Sub(2) + atom.Inc() + atom.Dec() + atom.CAS(1, 0) + atom.Swap(5) + atom.Store(1) + } } -func stressFloat64() { +func stressFloat64() func() { var atom Float64 - atom.Load() - atom.CAS(1.0, 0.1) - atom.Add(1.1) - atom.Sub(0.2) - atom.Store(1.0) + return func() { + atom.Load() + atom.CAS(1.0, 0.1) + atom.Add(1.1) + atom.Sub(0.2) + atom.Store(1.0) + } } -func stressBool() { +func stressBool() func() { var atom Bool - atom.Load() - atom.Store(false) - atom.Swap(true) - atom.CAS(true, false) - atom.CAS(true, false) - atom.Load() - atom.Toggle() - atom.Toggle() + return func() { + atom.Load() + atom.Store(false) + atom.Swap(true) + atom.CAS(true, false) + atom.CAS(true, false) + atom.Load() + atom.Toggle() + atom.Toggle() + } } -func stressString() { +func stressString() func() { var atom String - atom.Load() - atom.Store("abc") - atom.Load() - atom.Store("def") - atom.Load() - atom.Store("") + return func() { + atom.Load() + atom.Store("abc") + atom.Load() + atom.Store("def") + atom.Load() + atom.Store("") + } }