Skip to content

Commit

Permalink
sync: improve linearity test robustness
Browse files Browse the repository at this point in the history
This change improves the robustness of the locklinear test in the
following ways:

* It removes allocations from the timing, which may be very variable if
  we're unlucky.
* It ensures that goroutines are properly cleaned up before the test
  function returns, reducing the chance that they bleed into repeat
  attempts. It also stops timing before this cleanup.

Fixes #32986.

Change-Id: I3a8096e6922f23d899ad602e2845bdfc639ed742
Reviewed-on: https://go-review.googlesource.com/c/go/+/409894
Reviewed-by: Michael Pratt <mpratt@google.com>
  • Loading branch information
mknyszek committed Jun 13, 2022
1 parent 1fe2810 commit 56bc309
Showing 1 changed file with 29 additions and 7 deletions.
36 changes: 29 additions & 7 deletions src/sync/mutex_test.go
Expand Up @@ -340,16 +340,25 @@ func TestMutexLinearOne(t *testing.T) {
testenv.CheckLinear(t, func(scale float64) func(*testing.B) {
n := int(1000 * scale)
return func(b *testing.B) {
ch := make(chan int)
ch := make(chan struct{})
locks := make([]RWMutex, runtimeSemaHashTableSize+1)

b.ResetTimer()

var wgStart, wgFinish WaitGroup
for i := 0; i < n; i++ {
wgStart.Add(1)
wgFinish.Add(1)
go func() {
wgStart.Done()
locks[0].Lock()
ch <- 1
ch <- struct{}{}
wgFinish.Done()
}()
}
time.Sleep(1 * time.Millisecond)
wgStart.Wait()

wgFinish.Add(1)
go func() {
for j := 0; j < n; j++ {
locks[1].Lock()
Expand All @@ -358,6 +367,7 @@ func TestMutexLinearOne(t *testing.T) {
runtime.Gosched()
locks[runtimeSemaHashTableSize].Unlock()
}
wgFinish.Done()
}()

for j := 0; j < n; j++ {
Expand All @@ -368,10 +378,14 @@ func TestMutexLinearOne(t *testing.T) {
locks[runtimeSemaHashTableSize].Unlock()
}

b.StopTimer()

for i := 0; i < n; i++ {
<-ch
locks[0].Unlock()
}

wgFinish.Wait()
}
})
}
Expand All @@ -387,17 +401,21 @@ func TestMutexLinearMany(t *testing.T) {
return func(b *testing.B) {
locks := make([]RWMutex, n*runtimeSemaHashTableSize+1)

var wg WaitGroup
b.ResetTimer()

var wgStart, wgFinish WaitGroup
for i := 0; i < n; i++ {
wg.Add(1)
wgStart.Add(1)
wgFinish.Add(1)
go func(i int) {
locks[(i+1)*runtimeSemaHashTableSize].Lock()
wg.Done()
wgStart.Done()
locks[(i+1)*runtimeSemaHashTableSize].Lock()
locks[(i+1)*runtimeSemaHashTableSize].Unlock()
wgFinish.Done()
}(i)
}
wg.Wait()
wgStart.Wait()

go func() {
for j := 0; j < n; j++ {
Expand All @@ -417,9 +435,13 @@ func TestMutexLinearMany(t *testing.T) {
locks[0].Unlock()
}

b.StopTimer()

for i := 0; i < n; i++ {
locks[(i+1)*runtimeSemaHashTableSize].Unlock()
}

wgFinish.Wait()
}
})
}

0 comments on commit 56bc309

Please sign in to comment.